On May 23, 2014, at 9:51 AM, Mills, Steve wrote:

> We have some generic window loading code that must instantiate the window 
> controller first, then calls initWithWindowNibName: on that. This made it 
> impossible to provide a subclass of our generic window controller subclass in 
> the xib, but now we need to do this. Since NSNib doesn't have a method or 
> property for the file's owner, the best way I know of to get this is to look 
> for the window in the nib (see function below), gets its controller, get the 
> controller's class, then release the window so we can create things in our 
> "normal" way.
> 
> If there some better way to get the file's owner class?

I'm not sure that I follow what you're trying to do, but there's no File's 
Owner _in_ the NIB.  The owner is provided from the outside when the NIB is 
loaded.

Specifying the class of the File's Owner in the NIB is a purely design-time 
thing.  It's just to let IB know what outlets and action methods the object 
that will be provided at NIB load time should be assumed to have at design 
time.  The class specified for the File's Owner in the NIB does not affect what 
gets allocated.

If you want to tell IB that the owner will be a given class, then just go ahead 
and do that.  That will let you hook things up.  Then, at runtime, you only 
need to provide an object which supports the necessary connection points.  
(Supporting action methods isn't actually required to get the NIB to load.  
Menu items for absent action methods will typically just be disabled.  Buttons 
and the like will just do nothing.)

I doubt it's possible to learn the design-time-specified class from the objects 
of the loaded NIB.  The technique you outline doesn't make sense.  The window 
from the NIB won't have a controller if the controller was File's Owner and you 
passed nil for the owner when you loaded the NIB.  You just told the 
NIB-loading machinery to connect the window to nothing.

In any case, it seems totally backward to me that you would choose a NIB name 
to load but not also choose the class of the object to own it.  In fact, the 
best practice is to hard-code the NIB name into the controller class so that 
nothing else needs to know it.  So whatever code of yours is currently choosing 
a NIB name should instead choose a class to load and own the NIB and 
instantiated it.  So, for example:

@interface MyWindowController : NSWindowController
@end

@implementation MyWindowController

- (id) init
{
    self = [super initWithWindowNibName:@"MyNibName"];
    if (self)
        /* … finish initializing … */;
    return self;
}

@end

(… elsewhere:)
    MyWindowController* myWindowController = [[MyWindowController alloc] init];
    [myWindowController showWindow:self];


Since a window controller is so intimately tied to the NIB containing the 
window, it makes no sense to specify the two things independently.  The 
MyWindowController class couldn't meaningfully be used with a different NIB, so 
its interface shouldn't allow a client to specify a different NIB name.

Regards,
Ken


_______________________________________________

Cocoa-dev mailing list ([email protected])

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to