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

时间:2012-07-20 19:40:27

标签: cocoa interface embed builder awakefromnib

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

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

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

我理解这是对的吗?我最初的印象是每个实例只能调用一次awakeFromNib。我不应该在笔尖中嵌入笔尖吗?

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

2 个答案:

答案 0 :(得分:5)

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

  

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

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

答案 1 :(得分:0)

即使我有两个不同的文件所有者,awakeFromNib 仍然会被调用两次。

如果我有一个 NSWindowController 子类 (MyWindowController) 并且在它的笔尖中我有一个 ProjectController 对象,其中包含从笔尖加载视图的 awakeFromNib,则视图的控制器将获得一个awakeFromNib 调用,然后原来的 ProjectController 将再次收到 awakeFromNib