Cocoa界面生成器对象初始化

5
根据我查阅的文档和示例代码,我认为在Xcode中定义的类被读入并在Interface Builder中配置后,一个基于该类的对象将被有效地创建并存储在xib或nib文件中。因此,当相应的应用程序启动时,该对象已准备好供使用。
另外,对于尚未由Interface Builder处理的类,需要在Xcode中显式编写诸如“new”语句之类的代码,以便创建和使用相关对象。
如果有比我更了解Interface Builder的人能够确认或纠正我的非常幼稚的理解,那将非常好。
2个回答

6
你的理解是正确的,但还不完整。是的,Interface Builder会实例化类并将它们序列化到NIB中。然而,这些对象并不会自动对你的代码可用。
每个你想要通过Xcode访问的IB对象,你都需要声明一个IBOutlet变量。例如:
IBOutlet NSWindow* mainWindow;  // A Reference to your main window

将此代码放入您通过Interface Builder实例化的自定义对象的头文件中(将通用对象拖到您的类列表中,然后在检查器的标识选项卡中,将自定义对象设置为您的类的实例)。然后,在Interface Builder中右键单击您的自定义对象。您应该在弹出窗口中看到对IBOutlet的条目。从旁边的小圆圈拖动它到(在本示例中)主窗口中。现在,您在Xcode中有一个对IB对象的引用。
通过建立这些连接(使用IBOutlet进行引用和IBActions进行方法),您定义了应用程序的大部分行为。

感谢您的详细解释。但我有一个问题:您上面提到的“IBOutlet NSWindow* mainWindow;”示例语句是否必须是类的“属性”声明? - Stanley
不,只要添加IBOutlet关键字,它可以只是ivar,否则您将无法使用界面构建器链接它。 - Pochi

2
Nib文件包含一个对象图的归档副本;NSNib或NSBundle需要知道的所有内容,以便创建存储在nib文件中的所有对象的新实例,并按照nib的绑定连接起来,并将它们的属性设置为nib中指定的值。
完整的过程在对象加载过程中有详细说明。
对象不会自动从nib创建,而是根据某些对象加载nib文件时根据需要创建。这种差异很重要,因为您可以让单个对象多次加载nib,或者让多个对象加载相同的nib文件。
例如,我可以创建一个nib,其中“文件所有者”是UIViewController,将一个UIView对象绑定到文件所有者的“view”属性。然后,我可以让两个不同的UIViewController子类(或同一个UIViewController子类的两个实例)加载同一个nib文件,以获得它们自己的UIView的副本。类似地,每次需要新单元格时,我可能会从nib中加载一个新的UITableViewCell。

昨天实际上有3个答案,但现在只列出了2个。我认为这3个答案从不同的角度提供了很好的解决方案/建议。但是昨天已经很晚了,我没有时间完全尝试第三个建议。有没有办法可以检索到我昨天看到的第三个答案? - Stanley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接