【问题标题】:when exactly do Interface Builder items get instantiated?Interface Builder 项目何时被实例化?
【发布时间】:2011-08-11 11:08:30
【问题描述】:
假设我从 XCode4 中的模板创建了一个基于导航的应用程序,那么在 MainWindow.xib 中将有一个导航控制器,它有一个子 RootViewController。
那么具体什么时候:
- 要创建 RootViewController 的实例吗?
- 此实例是否作为子级与导航控制器相关联?
特别是当涉及到 applicationDelegate “didFinishLaunchingWithOptions”方法的时间以及它发生的时间。
【问题讨论】:
标签:
iphone
ios
uinavigationcontroller
xcode4
rootview
【解决方案1】:
在 plist 中,MainWindow 是主 nib 文件的基本名称。所以有一些隐藏代码将基于 plist 生成,以在启动时加载主窗口 nib 文件。这发生在 didFinishLaunchingWithOptions 之前。
加载 MainWindow nib 后,会在后台执行一系列操作,请参阅资源编程指南中的 The Nib Object Life Cycle。
其中一个步骤是
它取消归档 nib 对象图
数据并实例化对象。
然后几乎终于做到了:
它发送一个 awakeFromNib 消息到
笔尖中的适当对象
定义匹配的文件
选择器:
...
在 iOS 中,此消息仅发送到
接口对象是
由 nib 加载代码实例化。
它没有发送给文件的所有者,首先
Responder 或任何其他代理对象。
您可以掌握的第一种方法是awakeFromNib。
回答你的三个问题:
- 在加载 MainWindo nib 文件期间
- 是的,看看界面生成器中的 nib 文件
- 这一切都发生在 didFinishLaunchingWithOptions 之前
【解决方案2】:
所有这些都将在代码到达application:didFinishLaunchingWithOptions: 之前完成。 UIApplicationMain() 函数(从应用程序的 main() 函数调用)加载 MainWindow.nib。加载 NIB 文件时,NIB 文件中的所有对象都会被实例化并建立对象之间的连接。
请注意,这意味着视图控制器本身已经存在于application: didFinishLaunchingWithOptions: 中。视图控制器的视图并非如此。视图控制器在第一次访问时会延迟加载其视图。