为什么我的awakeFromNib不会开火?

时间:2009-10-19 13:54:52

标签: iphone interface-builder nib xib

我开始将更多的视图层次结构移动到IB。

我有一个名为“AlignmentViewController.xib”的nib文件,其中我使用AlignmentViewController作为文件所有者设置我的视图层次结构。这很好。

我仍然模糊的方法之一是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:indirect。这是不好的做法吗? AlignmentViewController.xib文件定义了我的视图层次结构。但我不是真的使用initWithNibName:bundle:以典型的方式?有更好的方法吗?

4 个答案:

答案 0 :(得分:35)

在实例化所有nib对象之后,

-awakeFromNib被发送到从nib实例化的所有对象。所有者不是这些对象之一。它在反序列化nib之前存在,并在加载后连接到nib,因此它不会被发送-awakeFromNib(当然除非它被其他一些nib本身实例化)。

这里的一个线索是,-initFromChromosomePair:basepairStart:basepairEnd:-awakeFromNib都无法被调用。 nib加载器始终调用-initWithCoder:-initWithFrame:-init(其中的规则发送在Nib Object Life Cycle中)。您有一些其他指定的初始化程序的事实强烈建议您在代码中的某处手动创建此对象,这意味着此对象不是“从笔尖唤醒”。

答案 1 :(得分:34)

只是添加一个澄清:-awakeFromNib被发送到Cocoa中的File所有者,但不是Cocoa Touch。

From Apple's Docs:

...

  • 它将awakeFromNib消息发送到nib文件中定义匹配选择器的相应对象:
    • 在Mac OS X中,此消息将发送到定义该方法的任何接口对象。它也会被发送到文件所有者以及定义它的任何代理对象。
    • 在iPhone OS中,此消息仅发送到由nib加载代码实例化的接口对象。它不会发送到文件的所有者,第一响应者或任何其他代理对象。

答案 2 :(得分:2)

根据您告诉我们的内容,我相信我知道您的问题是什么。从nib文件反序列化对象时调用awakeFromNib。在这里你有一个对象,它是所有者,在之前加载了nib。因此awakeFromNib永远不会发送到您的AlignmentViewController.h

如果您需要在此处执行某些操作,请尝试使用loadView。或者只是在加载笔尖后执行此操作。你想要在awakeFromNib中做什么,你有什么打算做什么?

答案 3 :(得分:-2)

你应该覆盖funcawakeFromNib()。 不覆盖类 funcawakeFromNib()

override func awakeFromNib() {
    super.awakeFromNib()
    setupContent()
}