IBOutlet 啥时候初始化?

Posted

技术标签:

【中文标题】IBOutlet 啥时候初始化?【英文标题】:When does an IBOutlet initialize?IBOutlet 什么时候初始化? 【发布时间】:2013-04-21 17:14:24 【问题描述】:

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

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

【问题讨论】:

它在awakeFromNib 中,在此之后调用appDidFinishLaunching。检查cocoa app life cycle。很可能你还没有上钩。 编辑您的帖子以包含您尝试访问文本视图的方法的完整源代码。 Cocoa with Love 博客上有一篇非常好的博文,详细介绍了启动顺序:Cocoa Application Startup @AnoopVaidya:小心“in”这个词。 awakeFromNib 初始化插座;它们在之前 awakeFromNib 被初始化。它们“在 awakeFromNib 中初始化”,因为 awakeFromNib 中的代码将看到已初始化的 outlet(因为它们已经被初始化)而不是未初始化的 outlet。 【参考方案1】:

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

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

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

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

#2 回答了您的问题。

The Resource Programming Guide has more information。 Cocoa 和 Cocoa Touch 之间的细节略有不同,尤其是在发送 awakeFromNib 消息和不发送消息方面。

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

文本视图不是?

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

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

【讨论】:

【参考方案2】:

确保您已将 IBoutlet 链接到正确的文件所有者。点击文件所有者,然后点击身份检查器,可以看到文件所有者指向了正确的文件。

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

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

【讨论】:

IBOutlets 不必在标题中。另外,您希望在哪个对象上看到网点?如果尚未建立连接,则应插入插座的对象根本不会显示 other 对象的插座属性,如果 FO都不是对象。

以上是关于IBOutlet 啥时候初始化?的主要内容,如果未能解决你的问题,请参考以下文章

我们啥时候在它的 AppDelegate 中创建 IBOutlet ViewController 对象?

UITableView 的自定义初始化连接为 IBOutlet [关闭]

IBOutlet 初始化中的 UIView 框架中心不正确

我的 TableViewCell 自定义类中的 IbOutlet 从未被初始化

UITableView (IBOutlet) 在初始数据加载后变为空

将 IBOutlet 按钮放入数组时发出警告