ios的UIView和UIViewController的生命周期
目的:巧妙利用UIView和UIViewController的生命周期做合适的事能够提升界面加载的流畅度
1、UIVIew状态改变对应的方法调用
1.1 UIView显示过程的方法调用顺序如下:
-
- willMoveToSuperview:
-
- didMoveToSuperview
-
- willMoveToWindow
-
- didMoveToWindow
-
- layoutSubviews
1.2 UIView销毁过程的方法调用顺序如下:
-
- willMoveToSuperview
-
- willMoveToWindow
-
- didMoveToWindow
-
- didMoveToSuperview
-
- dealloc
注意:Apple建议上面这些方法不需要显式调用,只要重写即可。
如图1.1 是UIView的测试和图1.2是UIView的生命周期流程图
)
)
- dealloc
2、UIViewController的生命周期
假设场景:存在三个UIControllerView (A、B、C),页面切换如下:A进入B,在进入C,然后由C返回到B,在返回A,ControllerView的跳转示意图如下:
)
2.1 A->B->C生命周期
)
)
)
)
)
如图2.2所示:AViewController少initialize和init的方法调用,是因为在我demo测试中AViewController是UITableBar的一个item,而且不是第一个item,根据UITableBar的加载机制,只加载第一个item作为默认(如图2.3所示)。由图2.2可以看出AàB的跳转是全屏模式,在B的生命周期符合图2.1所展示的,而BàC不是全屏模式。其原因是在iOS 13的模态跳转中(如图2.4所示),需要指定跳转的模式,若是模式跳转是全屏模式,开启新的VC(我称为子VC)覆盖原来的VC(我成为父VC)则父VC的状态会被系统设置成为不可见(Disappear)。如果不是全屏模式,即在当前的父VC视图是可见的,所以子VC的生命周期没有调用父VC的(Disappear)。
)
**注:**使用pushViewController: animated: 跳转的生命周期是一样的。主要区别新开启的ViewController是不是全屏模式,对应着不同的生命周期。
2.2 C->B->A的生命周期
从CVC返回到BVC生命周期是:
-
- CViewController调用viewWillDisappear
-
- BViewController调用viewWillAppear
-
- CViewController调用viewDidDisappear
-
- BViewController调用viewDidAppear
)
- BViewController调用viewDidAppear
####从BVC返回到AVC的生命周期是:
-
- BViewController调用viewWillDisappear
-
- AViewController调用viewWillAppear
-
- AViewController调用viewDidDisappear
-
- BViewController调用viewDidAppear
- BViewController调用viewDidAppear
Tips:
当系统执行 layoutSubviews 完成后,会触发ViewController的 viewDidLayoutSubviews 方法调用。因为 viewDidLayoutSubviews 是 view 布局更新后会被唯一可靠调用的方法,所以我们应该把所有依赖于布局或者大小的代码放在 viewDidLayoutSubviews 中,而不是放在 viewDidLoad 或者 viewDidAppear 中。这是避免使用过时的布局或者位置变量的唯一方法。
再者, 新手的文章可能有误,请指正。