我是Cocoa的新手,我不理解.nib文件的File's Owner
的概念。
以下是我看待事物的方式:
考虑一个描述窗口外观的文件myNibFile.nib
文件。
现在,我想将一个实际窗口连接到此.nib文件。所以,我创建了一个类myWindow
,它是NSWindowController
的子类。并且,要进行此连接,我会更改init
方法,如下所示:
-(id)init
{
[super initWithWindowNibName:@"myNibFile"];
return self;
}
所以,我理解当我创建myWindow
的实例时,“系统”会查看.nib文件并创建适当的对象。
所以,我的问题是:
为什么我必须指定我的.nib文件的File's Owner
为myWindow
?这不是多余的吗?
我想这意味着我真的不明白File's Owner
是什么。它是什么 ?为什么.nib文件必须属于某个东西?不能在我的“应用程序”中“某处”,当需要它时,“系统”会去那里并使用它吗?
感谢您帮助我更清楚地了解这些新概念!
答案 0 :(得分:58)
要记住两点:
loadNibNamed:
或initWithNibName:
的对象。因此,您创建了一个包含大量按钮,子视图等的精美视图。如果要在从加载对象(通常是视图或窗口控制器)加载nib之后随时修改任何这些视图/对象,请将这些对象的出口设置为文件所有者。就这么简单。
这就是为什么默认情况下所有视图控制器或窗口控制器都充当文件所有者,并且还有一个出口到nib文件中的主窗口或视图对象:因为,如果你正在控制某些东西你将会肯定需要有一个插座,以便您可以发送消息。
它被称为文件所有者并给出一个特殊位置的原因是因为与nib中的其他对象不同,文件所有者是nib的外部而不是它的一部分。实际上,只有在加载笔尖时它才可用。因此,文件所有者是实际对象的替代或代理,稍后将加载nib。
希望你明白。如果你问我,我会澄清任何一点。
答案 1 :(得分:6)
要理解的基本要点是Interface Builder允许您创建自动相互连接的对象,而不需要您的程序。您可以实例化所有类型的对象,包括非查看对象,它们可以是相互关联的;例如,您可以创建表视图数据源的实例以及视图本身等。此机制通常用于在主菜单NIB中创建应用程序代理。
但是,由于它都是通过拖放操作完成的,所以似乎没有办法在任何NIB对象和应用程序中已存在的对象之间形成连接,但有一个例外。
当代码加载NIB文件时,您可以选择准确指定一个对象,NIB将其视为“文件所有者”。这是您在Interface Builder中看到的占位符;因为它可以表示应用程序中的任何对象,所以Interface Builder无法知道它上面有哪些操作/出口。这就是您可以在“属性”选项卡中修改“文件所有者”的“类”的原因。
文件所有者并不真正代表“所有权”或“父母身份”。它代表的是“加载此NIB的对象”。
答案 2 :(得分:0)
文件所有者是IB中的占位符,因此代码中的所有出口和操作都是“可链接的”,您可以通过控制 - 拖动将屏幕上的内容连接到代码。
答案 3 :(得分:0)
Interface Builder中的文件所有者是这样的,它知道父对象的对象类型。这有两种用途。首先,在Interface Builder中,IB知道您可以连接的插座和操作。其次,应用程序框架使用它来了解如何在加载nib文件后将内容重新连接到其余代码。