前言

UIViewController 往往是 iOS 页面开发的基础,用户交互和数据展示都是由它来控制,了解了它的生命周期,就能做到:在合适的时机,做合适的事情

顺序

下面对 UIViewController 的每个生命周期函数进行一个打印,确定它们的执行顺序。

@implementation ViewController- (void)loadView
{[super loadView];NSLog(@"%@", NSStringFromSelector(_cmd));
}- (void)viewDidLoad
{[super viewDidLoad];NSLog(@"%@", NSStringFromSelector(_cmd));
}- (void)viewWillAppear:(BOOL)animated
{[super viewWillAppear:animated];NSLog(@"%@", NSStringFromSelector(_cmd));
}- (void)viewWillLayoutSubviews
{[super viewWillLayoutSubviews];NSLog(@"%@", NSStringFromSelector(_cmd));
}- (void)viewDidLayoutSubviews
{[super viewDidLayoutSubviews];NSLog(@"%@", NSStringFromSelector(_cmd));
}- (void)viewDidAppear:(BOOL)animated
{[super viewDidAppear:animated];NSLog(@"%@", NSStringFromSelector(_cmd));
}@end
复制代码

含义

- loadView

此时,控制器的 view 还未初始化,可以通过重写这个方法自定义控制器的 View,如果这样做,那就不能调用[super loadView](上面代码调用是为了方便打印,不然屏幕就是黑的)。

- viewDidLoad

在控制器的生命周期中,它只会被调用一次,此时,view 已经初始化好,非常适合做一些页面的初始化任务。由于此时 view 的 bounds 尚未确定,所以不适合写 frame 类型的布局代码,但是给视图添加约束没有影响。

- viewWillAppear

它会在控制器的视图将要出现在屏幕中时被调用,在控制器生命周期中可能会被调用多次。在此处,适合做一些与视图出现相关联的任务,例如改变状态栏的方向、风格。

- viewWillLayoutSubviews

当 view 的子视图即将布局时,此方法会被调用,触发的条件是:

  • view 被添加到视图层次中
  • view 的 bounds 发生了改变
  • 调用了 - setNeedsLayout方法
  • 调用了 - layoutIfNeeded方法

这个方法是写 frame 布局代码的好地方,将 view 的子视图布局好,每次 view 大小发生改变时,其子视图布局也会相应改变。

- viewDidLayoutSubviews

当 view 的子视图已经布局时,此方法会被调用,触发条件同上。

- viewDidAppear

它会在控制器的视图出现在屏幕后被调用,此时,view 的 bounds 已经确定,不过在这里写布局相关代码,可能会反映到屏幕上。

- viewWillDisappear

视图即将从屏幕中消失时触发。

- viewDidDisppear

视图从屏幕中消失后触发。

问题

1、上面测试代码中,- viewWillLayoutSubviews 方法打印了两次?

答:因为 view 被添加到视图层次中会触发一次,view 的 bounds 改变还会触发一次。

2、有控制器 A、B,从 A push 到 B,是 A 的 - viewDidDisappear 先触发,还是 B 的 - viewWillAppear 先触发?

答:B。

UIViewController 生命周期相关推荐

  1. iOS对UIViewController生命周期和属性方法的解析

    iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...

  2. 探究 UIViewController 生命周期

    由于种种原因,掘金等第三方平台博客不再保证能够同步更新,欢迎移步 GitHub:github.com/kingcos/Per-.谢谢! Lifecycle of UIViewController in ...

  3. UIViewController生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/notting/blog/77970

  4. UIViewController生命周期的理解

    if (self = [super init])=======>if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOr ...

  5. 【iOS开发】-UIViewController加载过程和生命周期

    文章目录 前言 ViewController执行过程的探讨 ViewControllerOne 函数介绍 顺序引入 ViewControllerSecond引入 ViewControllerOne点击 ...

  6. iOS UIViewController和UIView的生命周期

    文章目录 UIViewController的生命周期 UIView的生命周期 UIViewController和UIView进入展示时整体生命周期调用顺序 开发技巧总结 UIViewControlle ...

  7. Apple Watch学习之路 生命周期研究

    无论是Apple app或者Apple Watch app 掌握整个应用的生命周期尤为重要. 下图是watch app整个生命周期图 watchOS生命周期中在代码中是怎么实现的呢? 当用户在Home ...

  8. 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途...

    原文网址:http://blog.csdn.net/weasleyqi/article/details/8090373 iOS视图控制对象生命周期-init.viewDidLoad.viewWillA ...

  9. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、v...

    2019独角兽企业重金招聘Python工程师标准>>> iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.vie ...

最新文章

  1. Vivado安装器件不全
  2. es修改排序_java 如何实现ElasticSearch自定义排序
  3. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结
  4. 活久见的重构 - iOS 10 UserNotifications 框架解析
  5. Nginx 源码分析-- 模块module 解析执行 nginx.conf 配置文件流程分析 一
  6. 三维叉乘怎么算_3分钟做完这些题,你的CAD才算熟练
  7. 开放 API 接口签名验证,让你的接口从此不再裸奔 !
  8. 活动文档服务器,ACTIVEDOC 示例:实现活动文档服务器
  9. mac perl dbd mysql_Install DBD::mysql for Perl in XAMPP in Mac , solving errors
  10. FFmpeg mxf扩展hdr、bt2020
  11. solve函数c语言_c语言:回溯解数独程序
  12. 2021-06-10 MYSQL存储过程与触发器作业
  13. i711800h核显相当于什么显卡 i7 11800h相当于台式什么CPU
  14. 手机充电器的D+,D-电压
  15. 虚拟私助理要来了,五个行业将受影响人 | 分析
  16. 华为交换机:利用Excel转换MAC地址公式
  17. 东北林业大学计算机教师,我校教师马超感动众网友
  18. np.savetxt保存时数据不使用科学计数法形式
  19. 计算机的音标英语怎么说,电脑的英文怎么读标准发音
  20. 网络安全领域内的资格认证相关

热门文章

  1. 银行系统开发必读的三本书!银行IT开发
  2. JUC并发编程七 并发架构--wait/notify
  3. 线程:suspend与resume方法
  4. spring19:AspectJ的初步介绍
  5. csdn将文章添加到专栏
  6. SQL Server Extended Events (扩展事件)
  7. SAP 自动付款的配置
  8. Nginx入门到实战(4)常见问题
  9. 物联网与应用数字战略
  10. 【转】DontDestroyOnLoad(Unity3D开发之五)