为什么我的awakeFromNib不会开火?

dug*_*gla 13 iphone interface-builder xib nib

我开始将更多的视图层次结构移动到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;
}
Run Code Online (Sandbox Code Playgroud)

有人能为我澄清我在这里错过了什么吗?

干杯,道格

更新:在阅读了一些答案后,我意识到我需要深入了解非常基本的东西.

看初始化:

- (id)initWithChromosomeName:(NSString *)chromosomeName 
               basepairStart:(NSUInteger)basepairStart 
                 basepairEnd:(NSUInteger)basepairEnd {

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
Run Code Online (Sandbox Code Playgroud)

我注意到我正在调用initWithNibName:bundle:indirect.这是不好的做法吗?AlignmentViewController.xib文件定义了我的视图层次结构.但我不是真的使用initWithNibName:bundle:以典型的方式?有一个更好的方法吗?

Rob*_*ier 36

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

这里的一个线索是,有没有办法既-initFromChromosomePair:basepairStart:basepairEnd:-awakeFromNib可能都被调用.nib加载器始终调用-initWithCoder:,-initWithFrame:或者-init(其规则发送在Nib对象生命周期中).您有一些其他指定初始化程序的事实强烈建议您在代码中的某处手动创建此对象,这意味着此对象不是"从nib唤醒".

  • 很多火; 它们只是针对由nib加载器实例化的对象.nib的所有者不在*nib中,因此不会得到-awakeFromNib.-viewDidLoad被发送到视图控制器,您可以在nib完成加载后执行需要完成的操作.请注意,视图控制器可以在nib中,因此可以同时接收-awakeFromNib(从父nib加载时),然后接收-viewDidLoad(当它自己的nib完成加载时).在实例化nib中的所有对象并连接IBOutlet之后,将-awakeFromNib发送到nib中的所有对象. (3认同)

dod*_*gio 34

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

来自Apple的文档:

...

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