两段代码的在前后写的区别
一、区别
代码片段一:
[self.view addSubview:childViewController.view];
[self addChildViewController:childViewController];
和
代码片段二:
[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];
前后顺序不同,产生的结果也不同。
代码一:childViewController的viewWillAppear方法会调用一次,viewDidAppear方法会连续调用两次
代码二:childViewController的viewWillAppear方法不会调用,viewDidAppear方法会调用一次。
二、解释
按照这篇文章的解释:http://blog.csdn.net/zhaoxy_thu/article/details/50826190
当childViewController没有被加到任何父视图控制器时,如果把childViewController的view加到别的视图上,viewWillAppear和viewDidAppear会正常调用。但是当childViewController被加到一个父视图控制器上后,viewWillAppear和viewDidAppear就会与父视图控制器的viewWillAppear和viewDidAppear事件同步。
所以在以上代码中第一种情况下,先调用addSubView,viewWillAppear和viewDidAppear会各调用一次,再addChildViewController,与父视图控制器的事件同步,即当父视图控制器的viewDidAppear调用时,childViewController的viewDidAppear方法会再调用一次。所以viewDidAppear方法被调用了两次。
而在第二种情况下,先调用addChildViewController,childViewController的事件与父视图控制器同步,当父视图控制器的viewDidAppear调用时,childViewController的viewDidAppear方法会调用一次,再调用addSubView也不会触发viewWillAppear和viewDidAppear。
三、解决方案
3.1、方案一
除了自己注意之外,当然也可以使用下面代码方案解决,可以正常调用一次viewWillAppear和viewDidAppear:
[self addChildViewController:_baseVC];
//手动调用viewWillAppear!因为通过addsubview的方法延时加载,这个方法会被跳过
[_baseVC beginAppearanceTransition:YES animated:YES];
[self.view addSubview:_baseVC.view];
然后在移除这个VC的时候,调用下面,确保viewWillDisappear和viewDidDisappear被调用
[childController beginAppearanceTransition:NO animated:YES];
[childController.view removeFromSuperview];
[childController endAppearanceTransition];
3.2、方案二
如果嫌弃方案一麻烦,那就根据自己的需要,采取对应的代码顺序,自己管理逻辑也行
四、参考文章
- addChildViewController与viewWillAppear、viewDidAppear关系说明
- UIViewController中addChildViewController的坑:viewWillAppear不调用
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/585.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!