addChildViewController与viewWillAppear、viewDidAppear的备忘

两段代码的在前后写的区别

一、区别

代码片段一:

[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、方案二

如果嫌弃方案一麻烦,那就根据自己的需要,采取对应的代码顺序,自己管理逻辑也行

四、参考文章

Last modification:August 22nd, 2017 at 08:48 pm
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment