在nib中加载nib时,为什么awakeFromNib被调用两次?

在nib中加载nib时,为什么awakeFromNib被调用两次?

问题描述:

我有两个笔尖:Parent.xib和Child.xib。在nib中加载nib时,为什么awakeFromNib被调用两次?

我已经在子笔尖内包含了子笔尖以简化绑定。我在loadView中以编程方式设置子视图。问题是,awakeFromNib在Child的控制器中被调用两次。

我想我明白为什么会发生这种情况。当Parent完成加载时,它将awakeFromNib发送到它的对象,并且由于Child是其笔尖的文件所有者,因此它也会自行调用awakeFromNib。

我理解这个权利吗?我原本以为awakeFromNib每个实例只能调用一次。我不应该将笔尖嵌入笔尖吗?

见样本项目:https://github.com/panupan/AwakeFromNibTest

在有些情况下awakeFromNib可以被称为比每个实例一次,如一个你设置。另一种情况是加载多个笔尖对象的控制器。如果你真的想要,你可以解决这个问题,但更好的设计是不需要的。来自NSNibAwaking Protocol Reference

建议您在文件所有者对象及其关联的nib文件之间保持一对一的对应关系。使用相同的File's Owner对象加载两个nib文件会导致该对象的awakeFromNib方法被调用两次,这可能会导致某些数据结构以不希望的方式重新初始化。还建议您避免从awakeFromNib方法实现中加载其他nib文件。

在您的特定示例中,没有理由将一个nib文件嵌入到另一个文件中。如果没有将所有对象都放在一个单独的nib文件中的便利性,您将无法将它们都加载到内存中,从而导致内存占用不足。您应该将它们拆分并在nib文件中使用NSObjectController实例来处理它们之间的绑定。

+0

假设我想在两个nib中使用NSObjectController。链接它们的最好方法是通过代码绑定它们吗?我将一个笔尖嵌入另一个笔尖的原因是无需编写代码即可实现绑定。谢谢。 – panupan 2012-07-21 02:00:27

+0

您为'NSObjectController'实例创建一个'IBOutlet'。然后在'awakeFromNib'中使用'-setContent:'将对象控制器绑定到您希望它在另一个nib文件中表示的对象。在Interface Builder中,您可以设置控制器代表的对象的类以及您将使用的任何键。然后,您可以使用绑定到您的nib文件中的对象控制器,就好像它是原始对象一样。在IB中,将控制器键设置为“选择”,并将模型键路径设置为原始对象上的任何键。 – 2012-07-21 08:17:14

+0

谢谢,我会给它一个镜头。 – panupan 2012-07-21 13:56:53