viewcontroller生命周期

一、结构

按结构可以对iOS的所有ViewController分成两类:
1、主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
2、用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,因此后一个ViewController一般会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。
第一种ViewController会经常被继承,用来显示不同的数据给用户。

 

 

二、Controller和View的生命周期

这里指的View是指Controller的View。它作为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller的生命周期 > view的生命周期。

图2 ViewController生命周期


 

视图生命历程

1.alloc :创建对象,分配空间;

2.-[ViewController initWithCoder:]或-[ViewController initWithNibName:Bundle]。首先从归档文件中加载UIViewController对象。即使是纯代码,也会把nil作为参数传给后者。

3.-[ViewController awakeFromNib]:作为第一个方法的助手,方便处理一些额外的设置。

4.-[ViewController loadView]:创建或加载一个view并把它赋值UIViewController的view属性

5.-[ViewController viewDidLoad]:此时整个视图层次(view hierarchy)已经被放到内存中,可以移除一些视图,修改约束,加载数据等

6.-[ViewController viewWillAppear:]:视图加载完成,并即将显示在屏幕上,还没有设置动画,可以改变当前屏幕方向或状态栏的风格等。

7.-[ViewController viewWillLayoutSubviews]:即将开始子视图位置布局,可能被多次调用,比如addSubView或者removeSubView, 修改一个已存在view的frame不会触发.

8.-[ViewController viewDidLayoutSubviews]:用于通知视图的位置布局已经完成, 可能被多次调用,比如addSubView或者removeSubView.修改一个已存在view的frame不会触发.

9.-[ViewController viewDidAppear:]:视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。

10.-[ViewController viewWillDisappear:]:视图即将消失

11.-[ViewController viewDidDisappear:]:视图已经消失

 

三、代码组织(如何设计良好的viewcontroller)

ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
1、init里不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2、loadView中只初始化view,最好也不要做额外的操作。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。
3、viewDidLoad 这时候view已经有了,最适合创建一些附加的view和控件了。注意:如果ViewController是在storyboard中的,viewDidLoad中获取到的frame就是正确的, 如果是Xib加载出来的,viewDidLoad中获取到的frame是xib中的尺寸,到viewWillAppear中才能拿到正确的尺寸.
 

init , loadview , viewDidLoad 一般只调用一次 . 

 

viewWillAppear,  viewDidAppear,  

viewWillDisappear,  viewDidDisappear , 

viewWillLayoutSubviews,  viewDidLayoutSubviews  ,这几个是会重复调用的 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值