You're overthinking the problem.

NSWindowController doesn't have a 'delegate' method or property, which is the 
cause of the warning you are receiving.

Using a delegate to handle the result from a sheet is reasonable - it's what I 
invariably do. But you have to add that delegate property yourself in your 
NSWindowController subclass. This can be a simple assigned ivar:

@interface MyWindowController : NSWindowController
{
        id delegate;
}

@property (assign) id delegate;

@end

I would also not bother with a formal protocol for the delegate callback. Since 
you are checking whether the delegate responds to the selector, it may as well 
be an informal protocol, which is easier to set up.

Informal protocols are declared using a category on (usually) NSObject:

@interface NSObject (MyWindowControllerDelegate)

- (void)        windowController:(MyWindowController*) controller 
insertData:(NSDictionary*) dict;

@end


This also shows you two tips:

a) pass the controller that is doing the setting - there may come a time that 
you want to tell apart different ones, or request other information from the 
controller.
b) pass the data as a dictionary, not a mutable dictionary. The client should 
not be given any opportunity to mutate things that it has no business mutating.


--Graham








On 30/09/2011, at 10:38 AM, Koen van der Drift wrote:

> Thanks for the response, but, still not working.
> 
> 
> Here's in more detail what I'm trying to do. My main window is controlled by 
> MyAppDelegate:
> 
> @interface MyAppDelegate : NSObject <NSApplicationDelegate> 
> 
> 
> In MyAppDelegate I respond to an IBAction to open a second window to generate 
> some data that needs to be go back to MyAppDelegate to put in my model. The 
> second window is controlled by MyDataWindowController, a subclass of 
> NSWindowController.  
> 
> - (IBAction)showDataWindow:(id)sender
> {
>    MyDataWindowController *searchDataWindow  = [[MyDataWindowController alloc]
>                                      initWithWindowNibName: 
> @"searchDataWindow"];
>    [NSApp beginSheet:[searchDataWindow window]
>           modalForWindow:[self window]
>            modalDelegate: self
>           didEndSelector: nil
>              contextInfo: NULL];
> }
> 
> This all goes fine, the sheet opens and I get generate the data, stored in an 
> NSDictionary in MyDataWindowController. Now I  want somehow to get the data 
> back to MyAppDelegate. So I am trying this in MyDataWindowController:
> 
> At the top of MyDataWindowController I add this @protocol:
> 
> @protocol MyDataWindowControllerDelegate <NSObject>
> - (void)insertData: (NSMutableDictionary *)data;
> @end
> 
> and then after the data is obtained:
> 
>        id <MyDataWindowControllerDelegate> del = [self delegate];      //     
>  <-------
> 
>        if ([del respondsToSelector:@selector(insertData:)])
>        {
>            [del insertData: data]; 
>        }
>    }
> 
>    [NSApp endSheet: [self window] returnCode: 1];
>    [[self window] orderOut: self];
> 
> Which now gives the warning:
> 
> Semantic Issue: Instance method '-delegate' not found (return type defaults 
> to 'id') on the line with the arrow.
> 
> 
> 
> Any suggestions how to make this work?  Maybe not use a delegate?
> 
> 
> Thanks,
> 
> - Koen.
> 
> 
> 
> 
> 
> 
> _______________________________________________
> 
> 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/graham.cox%40bigpond.com
> 
> This email sent to graham....@bigpond.com

_______________________________________________

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