UIVIewController 生命周期
UIViewController对于使用UIKit 开发的iOS应用程序都是必不可少的。让我们详细了解一下他们的调用顺序
- loadView
- loadViewIfNeeded
- viewDidLoad
- viewWillAppear
- viewDidAppear
- viewWillLayoutSubviews
- viewDidLayoutSubviews
- viewWillDisappear
- viewDidDisappear
- traitCollectionDidChange
loadView:
- 当访问ViewController 的 View 属性时,并且 View属性为 nil 的时候调用
- 如果需要从 nil 文件或者代码中加载 view 时候,重写以自定义 ViewController 的 View
- 如果使用 Interface Builder 创建视图并初始化视图控制器,则不得重写此方法
- 此方法不应该调用此方法在父类中的实现 (示例:
super.loadView()) - 重写此方法后,我们需要将自定义视图赋值给 ViewController 的 view 属性
// 重写 loadView
override func loadView() {
let customView = UIView()
customView.backgroundColor = .red
self.view = customView
}
loadViewIfNeeded:
- 如果 ViewController 的 View 没有加载,这个方法会调用 loadView 方法。
- 这个方法可以在程序里面调用。
- 在编写单元测试调用 UIViewController 的 viewDidLoad 方法时很有用。
func testMyViewController() {
let myViewController = UIViewController()
// 这里 myViewController 的 view 还不存在
myViewController.loadViewIfNeeded()
// 这里 myViewController 的 view 已经被创建了
}
viewDidLoad:
- 当 ViewController 首次加载到内存中时调用此方法
- 在 ViewController 生命周期中,只会调用一次
- 覆盖此方法时,需要调用父类的 viewDidLoad
- 此方法很适合将子视图添加到视图
override func viewLoad() {
super.viewDidLoad()
let newView = UIView(frame: CGRect(x:0, y: 0, width: 50, height: 50))
view.addSubview(newView)
}
viewWillAppear:
- 在 ViewController 出现在屏幕上时调用
- 每当视图即将重新出现在屏幕上时调用。在 ViewController 生命周期中,可能会被调用多次
- 覆盖此方法时,需要调用父类的 viewWillAppear
viewDidAppear:
- 视图出现在屏幕上后调用
- 与 viewWillAppear 类似,viewWillAppear 是将要出现在屏幕上时调用,viewWillAppear 是 ViewController 出现在屏幕上之后调用。在 ViewController 生命周期中,可能会被调用多次
- 覆盖此方法时,需要调用父类的 viewDidAppear
- 当视图重新出现时需要用新数据刷新视图时,可以在此方法添加代码。例如,每次视图重新出现时都需要进行网络请求调用。
override func viewDidAppear(){
super.viewDidAppear()
networkFetcher.makeAPICall()
}
viewWillLayoutSubviews:
- 每次视图控制器的 layoutSubviews 即将被调用时调用
- 可能会被多次调用
- 当加载视图时,发生旋转事件时,或者当子视图控制器的大小被其父视图控制器更改时,都会被调用。
viewDidLayoutSubviews:
- 每次调用视图控制器的视图的 layoutSubviews后调用
- 此时视图的 frame 和 尺寸是正确的
- 避免重写此方法中的昂贵任务,因为在 uiviewcontroller 的生命周期中以及每次视图大小更改、旋转、应用布局计算等时,都可以调用多次
viewWillDisappear:
viewDidDisappear:
traitCollectionDidChange:
https://www.appcoda.com/view-controller-lifecycle/
https://medium.com/@pruthvi187/lifecycle-of-a-uiviewcontroller-75e76dbf490