2013-04-21 72 views
4

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

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

+2

它在'awakeFromNib'中,在此之后调用appDidFinishLaunching。检查[可可应用生命周期](https://www.google.co.in/search?q=cocoa+application+life+cycle&rlz=1C1ZMDB_enIN505IN505&source=lnms&tbm=isch&sa=X&ei=mh90UbyXGY_zrQeSloCgCg&ved=0CAoQ_AUoAQ&biw=1600&bih=785#imgrc= RWhVGa8ualTUCM%3A%3BLg5xA0bOlSeN5M%3Bhttp%253A%252F%252Fwww.java-samples.com%252Fimages%252Fcocoa-应用lifecycle.png%3Bhttp%253A%252F%252Fwww.java-samples.com%252Fshowtutorial.php%253Ftutorialid% 253D1220%3B492%3B488)。很可能你没有挂钩它。 – 2013-04-21 17:20:38

+0

编辑您的帖子以包含您尝试访问文本视图的方法的完整源代码。 – 2013-04-21 17:29:35

+1

@AnoopVaidya:小心这个单词“in”。 Outlet不会被*'awakeFromNib'初始化*;它们在* awakeFromNib之前被初始化*。它们是“在'awakeFromNib'中初始化的'',因为* awakeFromNib'中的代码会看到初始化出口(因为它们已经被初始化)而不是未初始化的出口。 – 2013-04-21 20:02:00

回答

12

插座不会实例化,因为插座是变量(或属性)。

当笔尖被加载时,笔尖中的对象被实例化,并且在创建对象之后,但在将awakeFromNib发送给所有相关对象之前,尽可能快地将它们分配给每个插座。

换句话说,笔尖装载完成所有以下的,在这个顺序:

  1. 创建或重新创建所有被存储在所述笔尖的对象。 (此不包括文件的所有者,第一响应者以及其他外部和虚拟对象。)
  2. 将在笔尖中连接的每个outlet属性设置为与笔尖连接的相同笔尖中的对象。 (例如:视图控制器的view插座到顶层视图。)
  3. awakeFromNib发送到笔尖中的对象,并且(在可可中)也发送给文件的所有者(例如窗口控制器)。

你的问题是通过#2回答。

The Resource Programming Guide has more information。 Cocoa和Cocoa Touch之间的细节差别很大,特别是关于哪些对象发送了消息,哪些不是。

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

文本视图是不是?

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

另一种可能性:您在另一个笔尖创建了文本视图,而不是创建应用程序委托的文本视图(如果您甚至在所有笔尖中创建了应用程序委托),并且您没有将视图连接到正确的对象的出口。也许你在文本视图的笔尖中创建了第二个应用程序委托,这个应用程序委托实际上并不是应用程序的委托,这就是为什么真正的应用程序委托没有看到文本视图 - 您将文本视图提供给冒名顶替者,而不是真正的McCoy。

0

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

  1. 点击Interfacebuilder-下的对象>对象
  2. 在插座中,确保用于IBoutlets性质被示出。如果没有显示,文件所有者可能是错误的。
  3. 链接的出口的对象 - 点进>拖动线到对象

当-aka文件所有者 - 包含在所述.H IBoutlets视图控制器被初始化应创建的IBoutlets。

+0

'IBOutlet's不必位于标题中。另外,您期望看到哪些物品在网点上?如果该连接尚未建立,应该插入插座的对象根本不会显示* other *对象的outlet属性,并且如果FO不是任何对象,也不暗示关于文件所有者的任何内容。 – 2013-04-21 20:20:27