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

pan*_*pan 2 embed cocoa interface builder awakefromnib

我有两个笔尖:Parent.xib和Child.xib.

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

我想我明白为什么会这样.当Parent完成加载时,它会向其对象发送一个awakeFromNib,并且由于Child是其nib的文件所有者,因此它也会调用awakeFromNib.

我明白了吗?我最初的印象是每个实例只能调用一次awakeFromNib.我不应该在笔尖中嵌入笔尖吗?

请参阅示例项目:https://github.com/panupan/AwakeFromNibTest

tor*_*ons 5

在某些情况下,awakeFromNib每个实例可以调用多次,例如您设置的实例.另一种情况是一个加载多个nib对象的控制器.如果你真的想要,你可以解决这个问题,但更好的设计是不必要的.来自NSNibAwaking协议参考:

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

在您的特定示例中,没有理由将一个nib文件嵌入另一个nib文件中.你必须将它们都加载到内存中,而不方便在单个nib文件中包含所有对象,这样会占用内存空间.您应该将它们拆分并使用NSObjectControllernib文件中的实例来处理它们之间的绑定.