幕后发生了很多事情Cocoa视图和viewController管理.
1.viewController对象
从最基本的角度来说,viewController 是一个通用的控制器对象。当它第一次分配并初始化时,它没有与之关联的视图对象。仅当需要时才会实例化视图。因此,在不考虑视图的情况下,viewController 的生命周期与任何其他对象相同:
UIViewController * myVC = [[UIViewController alloc] initWith...];
...
[myVC release];
viewControllers 的指定初始值设定项是-initWithNibname:bundle:。如果您指定一个笔尖,viewController 可以自动从该笔尖加载其视图并连接您已定义的任何 IBOutlet(有关更多详细信息,请参阅下文)。
2. 加载和卸载视图
viewController 将根据需要加载其视图。这通常发生在-view
方法是第一次调用,并且可能在程序中的任何时间发生,具体取决于您初始化 UI 的方式。在程序的生命周期中,视图也可能被销毁并重新加载多次,具体取决于您管理 UI 的方式。当 viewController 识别出它的视图是必需的但尚未加载时,-loadView
方法将被调用。基本的消息流是这样的:
view
loadView
viewDidLoad
请注意,如果您覆盖-view
方法,-loadView
and viewDidLoad
不会被自动调用。如果你覆盖-loadView
, you must设置viewController的view
财产。否则,下次调用-view
将再次触发加载过程。
视图也可以在程序生命周期内的任何时候被卸载,只需设置view
财产给nil
。默认实现-didReceiveMemoryWarning
只要视图没有超级视图(即,如果它当前不是活动视图层次结构的一部分),就会自动执行此操作。消息流程如下:
view = nil
viewDidUnload
2a.以编程方式加载视图
如果您选择覆盖-loadView
,您可以以任何您喜欢的方式创建视图、子视图、其他视图控制器以及这些对象之间的任何连接。当然,这意味着您还负责您创建的对象的内存管理。如果你的子类重写了-loadView
,它应该使用初始化nil
对彼此而言nibName
and bundle
.
2b.从笔尖加载视图
如果使用 nib 文件,则默认实现-loadView
将自动打开该 nib 文件,实例化其对象,添加它们之间的任何连接,并为您处理内存管理。
对于 nib 文件,事情会变得更加棘手,因为幕后发生了很多事情。这-awakeFromNib
方法被调用每个物体它在加载 nib 文件时实例化,并且不能保证调用时 nib 文件中的其他对象已完全加载。
3. 显示视图
-viewWillAppear:
, -viewDidAppear:
, -viewWillDisappear:
and -viewDidDisappear:
仅当视图在屏幕上显示或隐藏时才会调用,尤其是在从一个视图到另一视图的动画转换期间。当视图在导航方案中换入换出时,这些方法可能会在程序的生命周期内被多次调用。
4.视图布局
The -layoutSubviews
方法是not部分UIViewController
。呼吁UIView
当对象的边界发生改变时。如果您使用自定义UIView
如果您在程序中创建了子类,则此方法可用于执行自定义子视图布局,而不是依赖 Cocoa 默认的自动调整大小方法。
5. 将所有内容放在一起
由于其复杂性,此过程有多种不同的方式发生,但正常的时间线可能如下所示:
-[viewController initWithNibname:Bundle:]
-[viewController awakeFromNib]
-[viewController loadView]
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear] // user navigated away
-[viewController viewDidDisappear]
...
-[viewController viewWillAppear] // user navigated back
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear] // user navigated away
-[viewController viewDidDisappear]
...
-[viewController setView:nil] // memory warning, perhaps
-[viewController viewDidUnload]
...
-[viewController loadView] // user navigated back
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...