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:

  • 当 iOS 界面环境改变时调用。例如:size class,旋转,动态字体大小改变等等
  • 参数 previousTraitCollection 记录界面环境改变前的对象
  • 此方法默认实现为空,覆盖此方法需要调用父类
posted @   Loootus  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示