I am starting to move more of my view hierarchy construction to IB.
I have a nib file called "AlignmentViewController.xib" in which I set up my view hierarchy with AlignmentViewController as the files owner. This works fine.
One of the methods I remain fuzzy on is awakeFromNib. In the follow code snippet of AlignmentViewController I add the single additional method awakeFromNib. However, it does NOT get called:
- (void)awakeFromNib {
NSLog(@"AlignmentViewController - awakeFromNib");
[super awakeFromNib];
}
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
if (nil != self) {
self.title = @"Alignment";
self.chromosomeName = chromosomeName;
self.basepairStart = basepairStart;
self.basepairEnd = basepairEnd;
self.wantsFullScreenLayout = YES;
}
return self;
}
Can someone clarify for me what I have missed here?
Cheers, Doug
UPDATE: After reading some the the answers I realize I need to get to the bottom of something that is pretty fundamental.
Looking at the initialization:
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
I notice I am calling initWithNibName:bundle: indirectly. Is this bad practice? The AlignmentViewController.xib file defines my view hierarchy. But I'm not really using initWithNibName:bundle: in the typical way? Is there a better way to do this?
-awakeFromNib
is sent to all object that are instantiated from the nib after all nib objects have instantiated. The owner is not one of those objects. It exists prior to deserializing the nib and is wired to the nib after loading, so it is not sent-awakeFromNib
(unless of course it is instantiated by some other nib itself).One clue here is that there's no way both
-initFromChromosomePair:basepairStart:basepairEnd:
and-awakeFromNib
could both be called. The nib loader always calls-initWithCoder:
,-initWithFrame:
or-init
(the rules for which is sent are in The Nib Object Life Cycle). The fact that you have some other designated initializer strongly suggests that you're manually creating this object somewhere in the code, which means this object is not "awaken from nib."Based on what you've told us, I believe I know what your problem is.
awakeFromNib
is called when an object is deserialized from a nib file. Here you have an object, which is the owner, that exists before the nib is loaded. ThusawakeFromNib
would never be sent to yourAlignmentViewController.h
.If you need to do something here, try using
loadView
instead. Or just do it after loading the nib. What is it that you're tying to do that you wanted to do it inawakeFromNib
?Just adding a clarification: -awakeFromNib is sent to File's Owner in Cocoa, but not Cocoa Touch.
From Apple's Docs:
...