Cocoa Interface Builder 对象初始化

Posted

技术标签:

【中文标题】Cocoa Interface Builder 对象初始化【英文标题】:Cocoa Interface Builder object initialization 【发布时间】:2011-01-15 04:42:01 【问题描述】:

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

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

如果有比我知识渊博的人来确认或纠正我对 Interface Builder 非常幼稚的理解,那将是非常好的......

【问题讨论】:

【参考方案1】:

您的理解是正确的,但不完整。是的,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 作为方法),您可以定义应用程序的大部分行为。

【讨论】:

感谢您的详细解释。但我还有一个问题:“IBOutlet NSWindow* mainWindow;”是否您上面提到的示例语句必须是类的“属性”声明? 不,只要添加IBOutlet关键字就可以是ivar,否则你将无法使用界面生成器链接它。【参考方案2】:

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

完整过程记录在The Object Loading Process

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

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

【讨论】:

昨天居然有3个答案。现在只列出了2个。我认为所有 3 个答案都从不同的角度给出了很好的解决方案/建议。但是昨天已经很晚了,我没有时间完全尝试第三个建议。有什么办法可以找回我昨天看到的第三个答案?

以上是关于Cocoa Interface Builder 对象初始化的主要内容,如果未能解决你的问题,请参考以下文章

从 Cocoa 中的其他 nib(即 Interface Builder)加载 nib

在 Cocoa/Interface Builder 中,单击按钮后如何清除文本字段中的文本

@IBDesignable 错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool 崩溃

Xcode 6:构建挂起并且 Interface Builder Cocoa Touch Tool 开始分配所有 RAM

使用 Xcode 故事板会导致 Xcode 冻结,并且 Interface Builder Cocoa Touch Tool 飙升至 %99

Interface Builder 对 UIScrollView 的正确约束是啥?来自 IB 的纯自动布局