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