为什么我应该设置文件所有者的类标识而不是 nib 中显示的自定义对象的类标识并从中建立连接?如果我将文件的所有者设置为 nil 会发生什么?对我来说,nil 文件的所有者一切正常,那么从它进行连接的尊重是什么?
3 回答
NIB 表示归档对象图。您可以加载它,该对象图将被重构。事情,您通常希望/需要将新加载的对象图挂接到程序的现有对象图中。您不希望它与其他事物分开,与其他事物脱节。
新加载的对象图可以通过几种方式连接到程序对象图的其余部分。一种方法是NIB 中可用的代理对象集。应用程序对象有一个。另一个这样的代理对象是文件的所有者。代理对象是在 NIB 中具有表示但实际上不包含在 NIB 中的事物。与 NIB 中的其他对象不同,代理表示的对象不是在加载 NIB 时创建的,而是在加载 NIB 之前存在的。代理允许在这些预先存在的对象和 NIB 中的对象之间建立连接。这就是 NIB 中的新对象图可以连接到程序的现有对象图的方式。
MainMenu NIB 是不寻常的。它是由 Cocoa 在应用程序启动时自动加载的,这意味着(不可能,真的)预先存在的对象并不多。该 NIB 通常还包含一个应用程序委托的实例,它是一种协调控制器。但是,通常其他类型的 NIB 不会包含协调控制器。(它们确实包含中介控制器,例如NSArrayController
,但这是不同的。)相反,协调控制器通常是在代码中创建的,并且通常它们负责加载 NIB。
例如,您将使用 anNSWindowController
作为窗口的协调控制器。窗口将在 NIB 中定义。窗口控制器将在代码中实例化——无论哪个代码决定应该创建一个窗口——并且它将加载 NIB。它也将是 NIB 的文件所有者。它将管理NIB 的窗口和顶级对象。
如果您将 File's Owner 设置为nil
,那么 a) 您此时可能正在处理非常简单的 NIB,并且 b) 您可能正在从您加载的 NIB 中泄漏顶级对象。
文件的所有者是包含该视图的所有 IBOutlets 和 IBActions 的文件。例如,如果您有一个类“ViewController”并且它包含一个IBOutlet UIButton *button
and -(IBAction)changeViewWhenButtonPressed: (id) sender
,那么连接插座和操作的唯一方法是将“ViewController”设置为视图的文件所有者。
我相对确定 Class Identity 是 File's Owner 的同义词。
此外,这些链接可能会有所帮助:
“文件的所有者”是 nib 中的对象可以引用 nib 之外的对象的方式,反之亦然。(还有一些更复杂的方法可以做到这一点,但它们并不经常使用。)如果您不需要这样做,则不需要使用文件的所有者。
对于主应用程序,文件的所有者是 Application 对象。如果您的所有应用程序逻辑都在自定义类中,并且在 nib 中实例化,并且如果您使用“第一响应者”发送到应用程序的操作消息,则您可能不需要与其建立连接。还行吧。
如果您有一个文档窗口或弹出框或其他东西,文件的所有者通常是正在查看的对象,因此能够将 ui 附加到它是很有用的。您可能会多次加载同一个 nib,每个 nib 都由该类的不同实例“拥有”——不同的文档或检查对象或其他东西。
(从根本上说,文件的所有者就是在 nib-loading 方法中传递给“所有者:”参数的任何对象。)