I thought that NSError is just an output parameter, which is set only in case 
of errors.

But in my completion handler block (see below) NSError MUST be initialized to 
nil, or it will NOT be set.

The same code works as expected when NOT inside a block.


#define REMOVE_BUG      //      if this is NOT defined, we get:

[...] __-[Alias_TestAppDelegate openAliasFile:]_block_invoke_1 outError1 
0x10057f3b0 (NOT initialized)
[...] __-[Alias_TestAppDelegate openAliasFile:]_block_invoke_1 outError2 
0x10057f3b0 (after error return)
[...] -[NSOpenPanel recoveryAttempter]: unrecognized selector sent to instance 
0x10057f3b0


Here is the code:

- (IBAction)openAliasFile: sender;
{
        (void)sender;
        
        NSOpenPanel *openPanel = [ NSOpenPanel openPanel ];
        [ openPanel setAllowsMultipleSelection: NO ];
        [ openPanel setCanChooseDirectories: NO ];
        [ openPanel setResolvesAliases: NO ];
        [ openPanel setMessage: @"Select Alias File" ];  

        [ openPanel beginSheetModalForWindow:   self.window
                                completionHandler:                      
^(NSInteger result)
                                {
                                if (result == NSOKButton) 
                                        {
                                                NSURL *bookmarkFileURL = [ 
openPanel URL ];
                                                
                                                [ [ self window ] 
setTitleWithRepresentedFilename: [ bookmarkFileURL path ] ];
                                                
                                    [ openPanel orderOut:self]; // close panel 
before we might present an error

                                                //      if <bookmarkFileURL> is 
NOT an alias file, <bookmarkData> will be nil, but <outError>
                                                //      is NOT set. Works 
correctly if we initialise  <outError> to nil.
                                                
                                                #ifdef REMOVE_BUG
                                                NSError *outError = nil;
                                                #else
                                                NSError *outError;
                                                NSLog(@"%s outError1 %p (NOT 
initialized)",__FUNCTION__, outError);
                                                #endif
                                                
                                                NSData *bookmarkData =  [ NSURL 
bookmarkDataWithContentsOfURL:  bookmarkFileURL 
                                                                                
                                error:                                          
        &outError 
                                                                                
                ];
                                                if ( bookmarkData == nil )      
//      error
                                                {
                                                        NSLog(@"%s outError2 %p 
(after error return)",__FUNCTION__, outError);

                                                        [ self  presentError:   
        outError 
                                                                        
modalForWindow:         [ self window ] 
                                                                        
delegate:                       nil 
                                                                        
didPresentSelector: NULL  
                                                                        
contextInfo:            NULL 
                                                        ];
                                                        
                                                        return;
                                                };                              
                

                                                //  do something with valid 
bookmarkData
                                                                
                                }
                                        else    //      cancelled
                                        {
                                                self.dataString = @"-- 
Cancelled --";
                                        };
                                }
        ];
}


Kind regards,

Gerriet.

P.S. Tested on 10.6.6

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to