我有两个笔尖:Parent.xib和Child.xib。
我在Parent nib中包含了Child nib以简化绑定。我在loadView中以编程方式设置子视图。问题是,awakeFromNib在Child的控制器中被调用了两次。
我想我明白为什么会这样。当Parent完成加载时,它会向其对象发送一个awakeFromNib,并且由于Child是其nib的文件所有者,因此它也会调用awakeFromNib。
我理解这是对的吗?我最初的印象是每个实例只能调用一次awakeFromNib。我不应该在笔尖中嵌入笔尖吗?
答案 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
。