【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被释放时调用。
相关推荐
莎士比亚的文学花园18 分钟前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
图码26 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
U盘失踪了32 分钟前
python curl转python脚本
开发语言·chrome·python
charlie11451419132 分钟前
Linux 字符设备驱动:cdev、设备号与设备模型
linux·开发语言·驱动开发·c
handler0134 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
FQNmxDG4S35 分钟前
Java泛型编程:类型擦除与泛型方法的应用场景
java·开发语言·python
我星期八休息1 小时前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
热心网友俣先生1 小时前
2026年第二十三届五一数学建模竞赛C题超详细解题思路+各问题可用模型推荐+部分模型结果展示
c语言·开发语言·数学建模
01漫游者1 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
IGAn CTOU1 小时前
Java高级开发进阶教程之系列
java·开发语言