5

根据我浏览过的文档和示例代码,我的印象是,当将 xcode 中定义的类读入并在 Interface Builder 中配置时,会有效地创建基于该类的对象并将其存储在 xib 或 nib 文件中. 因此,当启动相应的应用程序时,该对象就可以使用了。

或者,对于尚未由 Interface Builder 处理的类,必须在 xcode 中显式编写诸如“new”语句之类的代码,以便创建和使用关联的对象。

有比我知识渊博的人来确认或纠正我对 Interface Builder 非常幼稚的理解会非常好......

4

2 回答 2

6

您的理解是正确的,但不完整。是的,Interface Builder 实例化类并将它们序列化到 NIB 中。但是,这些对象不会自动用于您的代码。

对于您想通过 Xcode 访问的每个 IB 对象,您需要声明一个 IBOutlet 变量。例子:

IBOutlet NSWindow* mainWindow;  // A Reference to your main window

将此代码放在您通过 Interface Builder 实例化的自定义对象的头文件中(将通用对象拖到您的类列表中,然后在检查器的 Identity 选项卡中,将自定义对象设置为您的类的实例)。然后,在 Interface Builder 中右键单击您的自定义对象。您应该会在弹出的窗口中看到您的 IBOutlet 条目。从它旁边的小圆圈拖动到(在本例中)您的主窗口。现在,您在 Xcode 中获得了对 IB 对象的引用。

正是通过建立这些连接(使用 IBOutlets 作为引用,使用 IBActions 作为方法),您才能定义应用程序的大部分行为。

于 2011-01-15T04:53:03.953 回答
2

Nib 文件包含对象图的存档副本;NSNib 或 NSBundle 需要知道的一切,以便创建存储在 nib 文件中的所有对象的新实例,这些对象按照 nib 的绑定描述的方式连接在一起,并且它们的属性设置为 nib 中指定的值。

完整的过程记录在对象加载过程中

对象不是从 nib 自动创建的,而是根据加载该 nib 文件的某些对象而按需创建的。区别很重要,因为您可以让单个对象多次加载 nib,也可以让多个对象加载同一个 nib 文件。

例如,我可能会创建一个 nib,其“文件所有者”是 UIViewController,它将单个 UIView 对象绑定到文件所有者的“视图”属性。然后我可以让两个不同的 UIViewController 子类(或同一个 UIViewController 子类的两个实例)加载同一个 nib 文件,以便每个人都获得自己的 UIView 副本。同样,每当我需要一个新的表格单元格时,我可能会从一个笔尖加载一个新的 UITableViewCell 。

于 2011-01-15T09:13:21.133 回答