UIVIewController 生命周期

loootus / 2023-05-21 / 原文

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