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 记录界面环境改变前的对象
- 此方法默认实现为空,覆盖此方法需要调用父类
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体