使用addsubView添加多个View,这些View有时候不需要全部用到,如果有由视图控制器来管理,在需要的时候显示,不需要的时候释放掉以此来节省内存。 而且还有一个好处就是切换视图控制器的时候可以更加自由地定义动画以及定义子视图控制器的大小。
直接 add 进去的 SubView 不在 ViewController 的 view hierarchy 内,事件没法正常传递,ViewController应该且只应该管理一个view hierarchy。
1、对页面中的逻辑更加分明,相应的View对应相应的ViewController;
2、当某个子View没有显示时,将不会被Load,减少了内存的使用;
3、当内存紧张时,没有 Load 的 View 将被首先释放,优化了程序的内存释放机制。
使用addChildViewController的三个步骤
1、addChildViewController: 的同时调用 addSubView;
[self addChildViewController:sfViewControllr];
[self.view addSubview:sfViewControllr.view];
2、设置子视图的位置,并显示出来
sfViewControllr.view.frame = CGRectMake(0, 300, 1, 1);
[sfViewControllr didMoveToParentViewController:self];
3、移除子视图
[sfViewControllr willMoveToParentViewController:nil];
[sfViewControllr removeFromParentViewController];
[sfViewControllr.view removeFromSuperview];
可能遇到的问题: 如果在子Controller中,把自己从父Controller中移除,在ios6中没问题,在iOS7中,会崩溃
[self willMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
暂时的解决方法,在子Controller中发通知,通知父Controller,移除子Controller
关于子VC的生命周期:
当 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。
当我们暂时不需要显示这个子视图时可以只执行 addchildViewController 操作,而不执行addsubview操作,当需要显示时再调用 transitionFromViewController:toViewController:duration:options:animations:completion 方法将子视图显示出来。
有两类事件会被转发给子视图控制器:
1、外观方法:
- viewWillAppear:
- viewDidAppear:
- viewWillDisappear:
- viewDidDisappear:
2、旋转方法:
- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation:duration:
- didRotateFromInterfaceOrientation: