在iOS5中,ViewController中新添加了下面几个方法:
addChildViewController:是UIViewController的一个方法,iOS5之后加入的,使用这个方法可以达到addsubView一样的效果,而且好处多多。
addChildViewController的好处:
1. 无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
2. 当某个子View没有显示时,将不会被Load,减少了内存的使用。
3. 当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
API函数
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
- (void)removeFromParentViewController NS_AVAILABLE_IOS(5_0);
/**
* 着重介绍一下它
* transitionFromViewController:toViewController:duration:options:animations:completion:
* fromViewController 当前显示在父视图控制器中的子视图控制器
* toViewController 将要显示的姿势图控制器
* duration 动画时间(这个属性,old friend 了 O(∩_∩)O)
* options 动画效果(渐变,从下往上等等,具体查看API)
* animations 转换过程中得动画
* completion 转换完成
*/
- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(5_0);
- (void)willMoveToParentViewController:(nullable UIViewController *)parent NS_AVAILABLE_IOS(5_0);
- (void)didMoveToParentViewController:(nullable UIViewController *)parent NS_AVAILABLE_IOS(5_0);
使用方法
(1)添加
/*
* (1)调整 childViewController View Frame大小
* [父控制器.view addsubview:子控制器.view];
* (2)[父控制器 addChildViewController:子控制器];
* (3)[子控制器 didMoveToParentViewController:self];
*/
UIViewController *controller = (UIViewController *)(_controllers[i]);
controller.view.frame = CGRectMake( 0, 0,self.view.bounds.size.width,self.view.frame.size.height - 64.0f);
[self addChildViewController:controller];
[self.view addSubview:controller.view];
[controller didMoveToParentViewController:self];
(2)移除子控制器
[sfViewControllr willMoveToParentViewController:nil];
[sfViewControllr removeFromParentViewController];
[sfViewControllr.view removeFromSuperview];
(3)可能遇到的问题:
如果在子Controller中,把自己从父Controller中移除,在ios6中没问题,在iOS7中,会崩溃
[self willMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
//ios7中崩溃
暂时的解决方法,在子Controller中发通知,通知父Controller,移除子Controller