5

为什么我应该设置文件所有者的类标识而不是 nib 中显示的自定义对象的类标识并从中建立连接?如果我将文件的所有者设置为 nil 会发生什么?对我来说,nil 文件的所有者一切正常,那么从它进行连接的尊重是什么?

4

3 回答 3

11

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 中泄漏顶级对象。

于 2012-06-03T20:06:53.737 回答
7

文件的所有者是包含该视图的所有 IBOutlets 和 IBActions 的文件。例如,如果您有一个类“ViewController”并且它包含一个IBOutlet UIButton *buttonand -(IBAction)changeViewWhenButtonPressed: (id) sender,那么连接插座和操作的唯一方法是将“ViewController”设置为视图的文件所有者。

我相对确定 Class Identity 是 File's Owner 的同义词。

此外,这些链接可能会有所帮助:

iPhone SDK - xCode 中的文件所有者和第一响应者是什么?

文件所有者定义

什么是文件的所有者

于 2012-06-03T19:25:57.767 回答
3

“文件的所有者”是 nib 中的对象可以引用 nib 之外的对象的方式,反之亦然。(还有一些更复杂的方法可以做到这一点,但它们并不经常使用。)如果您不需要这样做,则不需要使用文件的所有者。

对于主应用程序,文件的所有者是 Application 对象。如果您的所有应用程序逻辑都在自定义类中,并且在 nib 中实例化,并且如果您使用“第一响应者”发送到应用程序的操作消息,则您可能不需要与其建立连接。还行吧。

如果您有一个文档窗口或弹出框或其他东西,文件的所有者通常是正在查看的对象,因此能够将 ui 附加到它是很有用的。您可能会多次加载同一个 nib,每个 nib 都由该类的不同实例“拥有”——不同的文档或检查对象或其他东西。

(从根本上说,文件的所有者就是在 nib-loading 方法中传递给“所有者:”参数的任何对象。)

于 2012-06-03T20:10:07.207 回答