什么问题可能导致将 nib 文件的所有者设置为 nil?

Posted

技术标签:

【中文标题】什么问题可能导致将 nib 文件的所有者设置为 nil?【英文标题】:What problems may cause setting nib file's owner to nil? 【发布时间】:2012-06-08 14:11:44 【问题描述】:

如果我可以在不使用文件所有者的情况下从 nib 文件加载对象,那么文件所有者存在的原因是什么?此外,可以在不使用文件所有者的情况下创建出口操作连接。例如,我可以直接从对象连接到笔尖。所以我真的无法理解对文件所有者的需求。它与MVC模式有什么关系吗?文件的所有者必须是 UIViewController 类型吗?

【问题讨论】:

【参考方案1】:

在加载 nib 文件的过程中,Cocoa 会生成在 nib 文件中序列化的每个对象。然后,对于 nib 文件中的每个连接,它调用目标对象上的setValue:forKey: 来创建连接。一些连接到对象nil。这些setValue:forKey: 消息被发送到作为文件所有者传递的任何对象。

如果您没有文件所有者,则nil 连接将被忽略。如果您没有nil 连接,那么它与没有文件所有者没有什么不同。这不是特别常见。

所有这些都允许您通过将不同的文件所有者传递给加载过程来实例化相同 nib 文件对象的多个实例。


编辑:

请记住,nib 文件只是一堆序列化的对象。当您使用initWithNibName:bundle: 以编程方式创建视图控制器时,视图控制器在加载 nib 文件之前已经存在。 nib 文件中的对象几乎总是希望能够引用该视图控制器。所以我们将视图控制器传递给UINib 作为文件所有者。任何 nib 文件中的 nilUINib 都会将其替换为文件所有者(通常是视图控制器)。

这是非常灵活的,但灵活性不是重点。如果在 nib 实例化期间没有传入,则无法引用 nib 文件中的视图控制器。

【讨论】:

连接到 nil 对象的原因是什么? “nil object”在 IB 中的意思是“作为文件所有者传递的对象”。 所以文件所有者存在的唯一原因是为 nib 添加更多动态,让我们能够在加载过程中更改他? 问题在于使其更具动态性,但需要能够访问至少一个不在 nib 文件中的对象。见编辑。

以上是关于什么问题可能导致将 nib 文件的所有者设置为 nil?的主要内容,如果未能解决你的问题,请参考以下文章

从 nib 文件加载的 UIView,我可以将所有者设置为它自己的视图吗?

Nib 文件在加载时忽略状态栏。为啥?

Nib IBOutlet 导致应用程序崩溃

UIPageController currentPage 顽固地将自身设置为 nib 值

NSObject 用 nib 加载 UIView 但文件所有者是 UIViewController

从 nib 文件在自定义视图中设置自定义委托