【iOS】UIViewController

视图加载:

视图初始化会设计两个方法:loadView和ViewDidload

当新添加一个视图控制器时,通过xcode生成的代码模版只有viewDidLoad代码。当视图控制器的view被请求时,loadView方法会被调用,但因为他还没背创建,所以会是nil。

视图通常会通过以下三种方式加载:

从nibs

从故事板(UIStoryboardSegue)

使用自定义代码创建UI
如果通过覆写loadview方法创建了自定义UI,需要牢记:

将view视图设置到视图层级的根上

确保视图正在被其他视图控制器共享

不要调用[super loadView]

在视图层次结构准备就绪后,视图呈现给用户之前,viewDidload会被调用一次。可以在方法中做一些一次性的初始化操作。


视图可见性

视图控制器提供了四个生命周期方法,以接收有关视图可视性的通知。

viewWillAppear:

当视图层级已经准备好,且视图即将被放入视图窗口时,此方法会被调用。在即将展示视图控制器或之前入栈(modal或者其他)的视图控制器弹出时,这种情况就会发生。

在这个时刻,过渡动画还未开始,视图对终端用户也是不可见的。不要启动任何视图动画,因为没有任何作用。

viewDidAppear:

当视图在视图窗口展示出来,且过渡动画完成后,此方法会被调用。

因为动画会耗费约300毫秒,所以,对比viewWillAppear:和viewDidLoad:,viewDidAppear:和viewWillDisappear:之间的时间差可能会比较大。

viewWillDisappear:

该方法表示视图将要从屏幕上隐藏起来。这可能是因为其他视图控制器想要接管屏幕,或该视图控制器将要出栈。

你可能会注意到,当此方法被调用时,没有办法能直接够判断这是由当前视图控制器要出栈还是其他视图控制器入栈导致的。

下文摘自【高性能iOS应用开发】,笔者会在以后慢慢理解

以下有一些高效使用生命周期事件的最佳实践:

不要重写loadView

如果每次都需要展示最新的信息,那么就在viewWillAppear中更新UI元素。

viewDidappear中开始动画,如果有视频流内容,也可以开始播放了

viewWillDisappear来暂停或停止动画,不做多余操作

viewDid Disappear 销毁内存中的复杂数据结构。


总结

UIViewController生命周期

  • + (void)initialize:函数并不会每次创建对象都调用,只有在第一次初始化的时候才会调用,再次创建将不会调用initialize方法。
  • init方法和initCoder方法相似,知识被调用的环境不一样。如果用代码初始化,会调用init方法,从nib文件或者归档(xibstoryboard)进行初始化会调用initCoderinitCoderNSCoding协议中的方法,NSCoding是负责编码解码,归档处理的协议。
  • loadView:是开始加载view的起始方法,除非手动调用,否则在ViewController的生命周期中只调用一次。
  • viewDidLoad:是我们最常用的方法,类成员对象和变量的初始化我们都会放在这个方法中。在创建类后无论视图展现还是消失,这个方法也只会在布局是调用一次。
  • viewWillAppear:(BOOL)animated:方法 是在视图将要展现出来的时候调用。
  • viewWillLayoutSubviews:方法是在将要布局子视图的时候调用。
  • viewDidLayoutSubviews:方法是在子视图布局完成后调用。
  • viewDidAppear:(BOOL)animated:方法是视图已经出现。
  • viewWillDisappear:(BOOL)animated:方法是视图即将消失。
  • viewDidDisappear:(BOOL)animated:视图已经消失。
  • deallocViewController被释放时调用。
相关推荐
数据知道6 分钟前
claw-code 源码分析:大型移植的测试哲学——如何用 unittest 门禁守住「诚实未完成」的口碑?
开发语言·python·ai·claude code·claw code
小堃学编程15 分钟前
【项目实战】基于protobuf的发布订阅式消息队列(2)—— 线程池
java·开发语言
每日任务(希望进OD版)21 分钟前
线性DP、区间DP
开发语言·数据结构·c++·算法·动态规划
怨言.22 分钟前
Java内部类详解:从基础概念到实战应用(附案例)
java·开发语言
AC赳赳老秦22 分钟前
OpenClaw image-processing技能实操:批量抠图、图片尺寸调整,适配办公需求
开发语言·前端·人工智能·python·深度学习·机器学习·openclaw
XiYang-DING23 分钟前
【Java】 Java 集合框架
java·开发语言
charlie11451419124 分钟前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c
diving deep29 分钟前
从零构建大模型--实操--搭建python环境
开发语言·python
We་ct30 分钟前
LeetCode 172. 阶乘后的零:从暴力到最优,拆解解题核心
开发语言·前端·javascript·算法·leetcode·typescript
沉淀粉条形变量41 分钟前
rust 单例模式
开发语言·单例模式·rust