假设场景:存在三个UIControllerView (A、B、C),页面切换如下:A进入B,在进入C,然后由C返回到B,在返回A,ControllerView的跳转示意图如下:
)
)
)
)
)
)
如图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是不是全屏模式,对应着不同的生命周期。
####从BVC返回到AVC的生命周期是:
当系统执行 layoutSubviews 完成后,会触发ViewController的 viewDidLayoutSubviews 方法调用。因为 viewDidLayoutSubviews 是 view 布局更新后会被唯一可靠调用的方法,所以我们应该把所有依赖于布局或者大小的代码放在 viewDidLayoutSubviews 中,而不是放在 viewDidLoad 或者 viewDidAppear 中。这是避免使用过时的布局或者位置变量的唯一方法。
再者, 新手的文章可能有误,请指正。