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

标签 cocoa interface embed builder awakefromnib

我有两个 Nib :Parent.xib 和 Child.xib。

我已将子 Nib 包含在父 Nib 内以简化绑定(bind)。我在 loadView 中以编程方式设置 subview 。问题是,awakeFromNib 在 Child 的 Controller 中被调用两次。

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

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

查看示例项目:https://github.com/panupan/AwakeFromNibTest

最佳答案

在某些情况下,每个实例可以多次调用 awakeFromNib ,例如您设置的实例。另一种情况是 Controller 加载多个 nib 对象。如果您确实愿意,可以解决这个问题,但更好的设计并不是必须的。来自 NSNibAwaking Protocol Reference :

It is recommended that you maintain a one-to-one correspondence between your File’s Owner objects and their associated nib files. Loading two nib files with the same File’s Owner object causes that object’s awakeFromNib method being called twice, which could cause some data structures to be reinitialized in undesired ways. It is also recommended that you avoid loading other nib files from your awakeFromNib method implementation.

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

关于cocoa - 为什么在 nib 中加载 nib 时会调用 awakeFromNib 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585956/

相关文章:

xcode - cocoa 中的 gnuTLS 或 SSL

c# - 如何从调用栈中反射(reflect)C#显式接口(interface)实现?

javascript - 如何在初始化许多视频时获取 Plyr 当前实例

delphi - 通用接口(interface)如何引用指向其类型参数的指针?

php - 使用此代码检查YouTube视频是否可嵌入

css - 如何在笔记本电脑图像中设置嵌入视频

objective-c - 如何获取 NSWindow 标题栏的颜色,特别是当窗口失去焦点时?

cocoa - NSTextView:替换所有选项卡

macos - 在沙盒中写入/卷的权利

c# - .NET Framework 内置接口(interface),构建自定义数据结构时的建议?