3

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

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

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

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

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

4

2 回答 2

5

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

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

在您的特定示例中,没有理由将一个 nib 文件嵌入到另一个文件中。您会遇到内存占用的缺点,即必须将它们都加载到内存中,而不方便将所有对象都放在一个 nib 文件中。您应该将它们拆分并使用NSObjectControllernib 文件中的实例来处理它们之间的绑定。

于 2012-07-20T23:09:11.343 回答
0

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

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

于 2021-03-13T22:22:25.520 回答