45

我是 Cocoa 的新手,我不了解File's Owner.nib 文件的概念。

这是我看待事物的方式:

  • 考虑一个myNibFile.nib描述窗口外观的文件。

  • 现在,我想将一个实际的窗口连接到这个 .nib 文件。所以,我创建了一个类myWindow,它是NSWindowController. 而且,为了进行这种连接,我改变了init这样的方法:

         -(id)init
         {
             [super initWithWindowNibName:@"myNibFile"];
             return self;
         }
    

所以,我知道当我创建一个实例时myWindow,“系统”会去查看 .nib 文件并创建足够的对象。

所以,我的问题是:

  • 为什么我必须指定File's Owner我的 .nib 文件是myWindow?这不是多余的吗?

  • 我想这意味着我并没有真正理解File's Owner. 它是什么 ?为什么 .nib 文件必须属于某个东西?难道它不能在我的“应用程序”中的“某处”,当需要它时,“系统”会去那里使用它吗?

感谢您帮助我更清楚地了解这些新概念!

4

4 回答 4

67

需要记住两点:

  • 文件所有者是加载 nib 的对象,即接收消息的对象loadNibNamed:initWithNibName:.
  • 如果你想在加载后访问 nib 中的任何对象,你可以在文件所有者中设置一个 outlet。

因此,您创建了一个带有许多按钮、子视图等的精美视图。如果您想在从加载对象(通常是视图或窗口控制器)加载 nib 后随时修改这些视图/对象中的任何一个,您可以将这些对象的出口设置为文件所有者。就是这么简单。

这就是为什么默认情况下所有视图控制器或窗口控制器都充当文件所有者的原因,并且在 nib 文件中也有到主窗口或视图对象的出口:因为呃,如果你正在控制某些东西,你肯定需要有一个出口,以便您可以向它发送消息。

The reason it's called file owner and given a special place, is because unlike the other objects in the nib, the file owner is external to the nib and is not part of it. In fact, it only becomes available when the nib is loaded. So the file owner is a stand-in or proxy for the actual object which will later load the nib.

希望你已经明白了。如果你问,我会澄清任何一点。

于 2013-03-07T07:17:05.570 回答
10

要理解的基本内容是,Interface Builder 允许您创建自动相互连接的对象,而无需您的程序。您可以实例化各种对象,包括非视图对象,并且它们可以相互关联;例如,您可以创建表视图数据源的实例以及视图本身等。这种机制通常用于在主菜单 NIB 中创建应用程序委托。

但是,由于这一切都是通过拖放完成的,因此您似乎无法在任何 NIB 对象和应用程序中已存在的对象之间建立连接,但有一个例外。

当代码加载 NIB 文件时,您可以选择精确指定一个对象,NIB 将其视为“文件所有者”。这是您在 Interface Builder 中看到的占位符;因为它可以代表应用程序中的任何对象,所以 Interface Builder 无法知道它上面有哪些可用的操作/出口。这就是您可以在“属性”选项卡中修改文件所有者的“类”的原因。

文件所有者并不真正代表“所有权”或“父母身份”。它代表的是“加载这个NIB的对象”。

于 2013-03-06T19:28:49.363 回答
0

File's Owner 是 IB 中的占位符,因此代码中的所有出口和操作在 IB 中都是“可链接的”,您可以控制拖动以将屏幕上的内容连接到代码。

于 2013-03-06T15:39:24.163 回答
0

Interface Builder 中的 File's Owner 使其知道父对象的对象类型。这以两种方式使用。首先,在 Interface Builder 中,IB 知道哪些出口和操作可供您连接。其次,应用程序框架使用它来了解如何在加载 nib 文件后将事物重新连接到其余代码。

于 2013-03-06T15:47:44.213 回答