文件所有者是什么(在界面构建器中)?

48
我是一名新手,对Cocoa不太了解,也不理解.nib文件中“文件所有者”的概念。
以下是我对此事的看法:
  • Consider a file myNibFile.nib file that describes how a window looks.

  • Now, I want to connect an actual window to this .nib file. So, I create a class myWindow, which is a subclass of NSWindowController. And, to do this connection, I change the init method like this:

         -(id)init
         {
             [super initWithWindowNibName:@"myNibFile"];
             return self;
         }
    
所以,我理解当我创建myWindow实例时,“系统”会查找.nib文件并创建适当的对象。
所以,我的问题是:
  • 为什么我必须指定我的.nib文件的File's OwnermyWindow?这不是多余的吗?

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

感谢帮助我更清楚地了解这些新概念!
4个回答

73

需要记住两点:

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

因此,如果您创建了一个带有许多按钮,子视图等的花哨视图,并且想要在从加载对象(通常是视图或窗口控制器)加载nib后随时修改这些视图/对象之一,则应为这些对象设置文件所有者的插座。就这么简单。

这就是为什么默认情况下所有视图控制器或窗口控制器都充当文件所有者,并且还在nib文件中的主窗口或视图对象中具有插座的原因:因为如果您正在控制某些内容,则肯定需要有一个插座以便您可以向其发送消息。

之所以称为文件所有者并赋予特殊位置,是因为与nib中的其他对象不同,文件所有者外部于nib并且不是其组成部分。实际上,只有在加载nib时才会变为可用。因此,文件所有者是稍后将加载nib的实际对象的替身或代理。

希望你理解了。如果您有任何问题,我会进行澄清。


谢谢你的回答。对我来说,最后一段是最重要的:文件所有者不是nib的一部分。答案“你需要outlets…”对我无效,因为outlets可以属于您添加到NIB中的对象。我的想法是,您可以通过代码(loadNibNamed等)将对象和NIB链接(实际上必须),因此您不需要冗余链接“文件所有者”,但是:您将如何连接这些outlets到此对象?您回答了这一点。 - Colas
我在等待一个令人满意的答案!也许您可以重新组织您的回答,强调最后一段。谢谢。我希望我的最后一条评论很清楚。 - Colas
难道不是 NSNib 对象接收 loadNibNamed:initWithNibName: 吗?然后将文件所有者作为参数传递给实际实例化 NIB 的方法。 - flarn2006

10
基本理解是Interface Builder允许您创建自动连接的对象,而无需编写程序。您可以实例化各种对象,包括非视图对象,并且它们可以相互关联;例如,您可以创建表格视图数据源的实例以及视图本身等。此机制通常用于在主菜单NIB中创建应用程序代理。
但是,由于所有操作都是通过拖放完成的,因此似乎没有办法在NIB对象和已存在于应用程序中的对象之间建立连接,除了一种情况。
当代码加载NIB文件时,您可以选择指定一个对象作为“文件所有者”。这是您在Interface Builder中看到的占位符;由于它可以表示应用程序中的任何对象,因此Interface Builder无法知道其上可用的操作/插座。这就是为什么您可以在属性选项卡中修改“文件所有者”的“类”的原因。
文件所有者并不真正表示“所有权”或“父母身份”。它代表的是“加载此NIB的对象”。

4
我仍然不理解,因为我从程序中真正调用NIB的方法是使用initWithWindowNibName:@"myNibFile"。通过这个指令,我创建了NIB和其他对象之间的连接。 - Colas

0

文件所有者是IB中的占位符,因此您代码中的所有输出和操作都可以在IB中“链接”,您可以使用控制拖动将屏幕上的内容连接到代码。


0

Interface Builder 中的“文件所有者”是为了让它知道父对象的类型。这有两种用途。首先,在 Interface Builder 中,这样 IB 就知道可供您连接的插座和操作。其次,应用程序框架使用它来知道如何重新连接事物到您的代码的其余部分一旦 nib 文件被加载。


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