我有两个笔尖:Parent.xib和Child.xib。
我将“孩子”笔尖包含在“父”笔尖中,以简化绑定。我在loadView中以编程方式设置了子视图。问题是,awakeFromNib在Child的控制器中被调用两次。
我想我知道为什么会这样。父级完成加载后,它将awakeFromNib发送到其对象,并且由于Child是其nib的文件所有者,因此它也会对其自身调用aakeakeFromNib。
我了解这个权利吗?我最初的印象是awakeFromNib每个实例仅应调用一次。我不应该在笔尖中嵌入笔尖吗?
请参见示例项目:https://github.com/panupan/AwakeFromNibTest
最佳答案
在某些情况下,每个实例可以多次调用awakeFromNib
,例如您设置的实例。另一种情况是控制器加载了多个笔尖对象。如果确实需要,可以解决此问题,但是不必设计更好的设计。从NSNibAwaking Protocol Reference:
建议您在文件的所有者对象及其关联的nib文件之间保持一一对应的关系。使用相同的File Owner对象加载两个笔尖文件会导致该对象的awakeFromNib方法被调用两次,这可能导致某些数据结构以不希望的方式重新初始化。还建议您避免从awakeFromNib方法实现中加载其他nib文件。
在您的特定示例中,没有理由将一个nib文件嵌入另一个文件中。您会遇到内存占用量不足的问题,即必须将它们都加载到内存中,而又不能将所有对象都放在一个nib文件中。您应该将它们分开,并在nib文件中使用NSObjectController
实例来处理它们之间的绑定。