我开始将更多的 View 层次结构迁移到 IB。
我有一个名为“AlignmentViewController.xib”的 nib 文件,在其中我使用 AlignmentViewController 作为文件所有者设置了 View 层次结构。这工作得很好。
我仍然模糊的方法之一是awakeFromNib。在 AlignmentViewController 的以下代码片段中,我添加了单个附加方法 awakeFromNib。但是,它不会被调用:
- (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;
}
有人可以帮我澄清一下我在这里错过了什么吗?
干杯, 道格
更新: 在阅读了一些答案后,我意识到我需要深入了解一些非常基本的事情。
查看初始化:
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
我注意到我正在间接调用 initWithNibName:bundle: 。这是不好的做法吗? AlignmentViewController.xib 文件定义了我的 View 层次结构。但我并没有真正以典型的方式使用 initWithNibName:bundle: ?有更好的方法吗?
最佳答案
-awakeFromNib
在所有 nib 对象实例化后发送到从 nib 实例化的所有对象。所有者不是这些对象之一。它在反序列化 nib 之前就存在,并在加载后连接到 nib,因此不会发送 -awakeFromNib
(当然,除非它由其他某个 nib 本身实例化)。
这里的一个线索是,-initFromChromosomePair:basepairStart:basepairEnd:
和 -awakeFromNib
不可能同时被调用。 nib 加载程序始终调用 -initWithCoder:
、-initWithFrame:
或 -init
(发送的规则位于 Nib Object Life Cycle ) 。事实上,您有一些其他指定的初始化程序强烈表明您正在代码中的某个位置手动创建该对象,这意味着该对象没有“从 nib 中唤醒”。
关于iphone - 为什么我的 awakeFromNib 不会触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1588813/