我有两个笔尖:Parent.xib和Child.xib。
我已经将Child笔尖包含在Parent笔尖中,以简化绑定。我在loadView中以编程方式设置了子视图。问题是,wakeFromNib在Child的控制器中被调用了两次。
我想我明白为什么会发生这种事。当Parent完成加载时,它会向其对象发送一个wakeFromNib,由于Child是其nib的文件所有者,它也会在自己身上调用wakeFromNi。
我理解得对吗?我最初的印象是,wakeFromNib每个实例只能调用一次。我不应该把笔尖嵌入笔尖吗?
参见示例项目:https://github.com/panupan/AwakeFromNibTest
在某些情况下,每个实例可以多次调用awakeFromNib
,例如您设置的实例。另一种情况是控制器加载多个笔尖对象。如果你真的想的话,你可以解决这个问题,但更好的设计是不必这样做
建议您在文件的所有者对象与其关联的nib文件之间保持一对一的对应关系。用同一File的Owner对象加载两个nib文件会导致该对象的wakeFromNib方法被调用两次,这可能会导致一些数据结构以不希望的方式重新初始化。还建议您避免从wakeFromNib方法实现加载其他nib文件。
在您的特定示例中,没有理由将一个nib文件嵌入另一个文件中。内存占用的缺点是必须将它们都加载到内存中,而不方便将所有对象都放在一个nib文件中。您应该将它们拆分,并在nib文件中使用NSObjectController
实例来处理它们之间的绑定。
即使我有两个不同的文件所有者,awakeFromNib
仍然被调用两次。
如果我有一个NSWindowController
子类(MyWindowController),并且在它的笔尖中有一个包含从笔尖加载视图的awakeFromNib
的ProjectController
对象,则视图的控制器将获得awakeFromNib
调用,然后原始ProjectController
将再次接收awakeFromNib
。