5

我通过 Interface Builder 为文本视图设置了一个出口。文本视图加载正常,但是我无法以编程方式访问它的任何属性,因为插座始终是nil.

它什么时候实例化?即使在我applicationDidFinishLoading被调用后,它仍然不是“活着的”或未存档的。

4

2 回答 2

11

出口不会实例化,因为出口是一个变量(或属性)。

nib 中的对象在加载该 nib 时被实例化,并在创建对象之后但在awakeFromNib发送给所有相关对象之前尽快将它们分配给每个出口。

换句话说,nib 加载按以下顺序执行以下所有操作:

  1. 创建或重新创建存储在 nib 中的所有对象。(这不包括文件所有者、第一响应者以及其他外部和虚构对象。)
  2. 将 nib 中连接的每个出口属性设置为 nib 连接到的同一 nib 中的对象。(例如:视图控制器view到顶级视图的出口。)
  3. 发送awakeFromNib到 nib 中的对象,并且(在 Cocoa 中)也发送到文件的所有者(例如,窗口控制器)。

#2回答了您的问题。

资源编程指南有更多信息。Cocoa 和 Cocoa Touch 之间的细节略有不同,尤其是在哪些对象被发送awakeFromNib消息和哪些对象不发送消息方面。

它什么时候实例化?即使在我applicationDidFinishLoading被调用后,它仍然不是“活着的”或未存档的。

文本视图不是吗?

可能是,您只是没有连接插座。检查笔尖。

另一种可能性:您在另一个 nib 中创建了文本视图,而不是创建应用程序委托的那个(如果您甚至在 nib 中创建了应用程序委托),并且您没有将视图连接到右侧的插座目的。也许您在文本视图的 nib 中创建了第二个应用程序委托;这个应用程序代理实际上并不是应用程序的代理,这就是为什么真正的应用程序代理看不到文本视图的原因——您将文本视图提供给了冒名顶替者,而不是真正的 McCoy。

于 2013-04-21T20:14:56.063 回答
1

确保您已将 IBoutlet 链接到正确的文件所有者。单击文件所有者并单击身份检查器以查看文件所有者指向正确的文件。

  1. 点击Interfacebuilder->Objects下的对象
  2. 在 Outlets 下,确保显示 IBoutlets 的属性。如果它们没有显示,则文件所有者可能是错误的。
  3. 将出口链接到对象 - 单击->将线拖到对象

应该在初始化包含 .h 中的 IBoutlets 的视图控制器(也称为文件所有者)时创建 IBoutlets。

于 2013-04-21T17:23:03.013 回答