awakeFromNib 啥时候被调用?
Posted
技术标签:
【中文标题】awakeFromNib 啥时候被调用?【英文标题】:When does awakeFromNib get called?awakeFromNib 什么时候被调用? 【发布时间】:2012-02-03 00:59:26 【问题描述】:awakeFromNib
是否在 viewController 被分配和初始化后立即被调用?
视图控制器的awakeFromNib
在什么时候被调用?
在我的调试会话中,我看到 rootViewController 的 awakeFromNib
在执行 [self.window makeKeyAndVisible]
之前不会被调用。
【问题讨论】:
【参考方案1】:awakeFromNib
在视图及其子视图被分配和初始化后被调用。保证视图将设置其所有出口实例变量。
编辑:事件的详细叙述:
在实例化过程中,存档中的每个对象都是 未归档,然后使用适合其类型的方法进行初始化。 Cocoa 视图(以及可以使用 相关的 Interface Builder 调色板)使用它们的初始化 initWithCoder:方法。自定义视图使用它们的初始化 initWithFrame:方法。已实例化的自定义类 笔尖使用它们的 init 方法进行初始化。
一旦所有对象都从 存档,笔尖加载代码尝试重新建立连接 在每个对象的出口和相应的目标对象之间。如果 您的自定义对象有出口,一个 NSNib 对象试图 重新建立您在 Interface Builder 中创建的任何连接。它 首先尝试使用您的对象自己建立连接 先说方法。对于每个需要连接的插座,NSNIb object 在您的对象中查找形式为 setOutletName: 的方法。 如果该方法存在,则 NSNib 对象调用它,并传递目标 对象作为参数。如果你没有用那个定义一个 setter 方法 确切的名称,NSNIb 对象在对象中搜索实例 具有相应出口名称的变量(IBOutlet id 类型)和 尝试直接设置其值。如果一个实例变量带有 找不到正确的名称,该连接的初始化确实 不会发生。 最后,在所有对象完全初始化后,每个 收到一条 awakeFromNib 消息。
Source
编辑 2:这不适用于从情节提要加载的视图控制器。
【讨论】:
我对调用它的精确点感兴趣。是不是紧随其后?当我在调试器中跟踪时,直到 [window makeKeyAndVisible] 才会调用它。 @Boon:已编辑并附有详细说明。现在,对于与 makeKeyAndVisible 的精确关系:是的,可能会在窗口可见之前收到 awakeFromNib,因为如果它不会显示,则没有必要加载 nib,cocoa 和 cocoaTouch 通常依赖于延迟加载它们的界面跨度> 谢谢 - 取消归档异步/在单独的线程中完成? 这仅适用于笔尖。awakeFromNib
在从情节提要加载 ViewController 时被调用,但是 在 视图和子视图被初始化 - 保证视图和出口将被初始化,这基本上就是渲染的内容处理实际 nib 或 xib 文件时有用的方法,不适用。但在实践中,awakeFromNib
似乎是初始化过程中的最早点,当从情节提要加载时,访问 VC 的 .view
属性将强制它加载,因此如果您开始,您仍然可以以相同的方式使用它它与[self view]
.
@MarkAmery 你说得对。这使得声明“保证视图将设置其所有出口实例变量”。在从情节提要加载视图控制器的情况下无效。【参考方案2】:
当程序员想要加载一个它还没有初始化的对象时。
Exp:UITableViewCell
中的控件将在代码调用 awakeFromNib
而不需要 cellforrow
时初始化。
【讨论】:
以上是关于awakeFromNib 啥时候被调用?的主要内容,如果未能解决你的问题,请参考以下文章
awakeFromNib 无法从 UILabel 获取值,也无法禁用 UIButton