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