16

我开始将更多的视图层次结构移至 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:。这是不好的做法吗?AlignmentViewController.xib 文件定义了我的视图层次结构。但我并没有真正以典型的方式使用 initWithNibName:bundle: 吗?有一个更好的方法吗?

4

4 回答 4

38

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

这里的一个线索是没有办法两者-initFromChromosomePair:basepairStart:basepairEnd:-awakeFromNib可以调用。nib 加载器总是调用-initWithCoder:, -initWithFrame:or -init(发送的规则在 The Nib Object Life Cycle中)。您有一些其他指定的初始化程序这一事实强烈表明您正在代码中的某处手动创建该对象,这意味着该对象不是“从 nib 唤醒”。

于 2009-10-19T14:09:43.317 回答
35

只是添加一个说明: -awakeFromNib 被发送到 Cocoa 中的文件所有者,而不是 Cocoa Touch。

来自 Apple 的文档:

...

  • 它向 nib 文件中定义匹配选择器的适当对象发送 awakeFromNib 消息:
    • 在 Mac OS X 中,此消息被发送到定义该方法的任何接口对象。它也被发送给文件的所有者和定义它的任何代理对象。
    • 在 iPhone OS 中,此消息仅发送到由 nib 加载代码实例化的接口对象。它不会发送给文件所有者、第一响应者或任何其他代理对象。
于 2010-02-03T23:16:44.827 回答
2

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

如果您需要在这里做某事,请尝试使用loadView。或者只是在加载笔尖后进行。你想做的事情是awakeFromNib什么?

于 2009-10-19T14:21:26.617 回答
-2

您应该重写 func awakeFromNib()。不覆盖类 func awakeFromNib()

override func awakeFromNib() {
    super.awakeFromNib()
    setupContent()
}
于 2021-03-10T15:26:01.547 回答