UIViewController中的addChildViewController使用备忘
苹果在iOS5之后增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:childViewController]方法将sub view对应的viewController也加到当前ViewController的管理中。
对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去
需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。
因为之前一直用的是直接[self.view addSubView:self.otherViewController.view],这样做虽然可以直接使用其他控制器的视图,但是在多个控制器的调度的时候却带来了很多问题,包括viewWillAppear不执行等问题。
但是用addChildViewController可以使得当有多个view,并且同一时间只需要显示一个view的时候,在内存占用方面会更节省一些。
一下为代码简要使用说明:
self.contentView = [[UIView alloc]init];
[self.view addSubview:self.contentView];
[self.contentView setBackgroundColor:[UIColor whiteColor]];
self.addressListVC = [[ZCInvoiceAddrListViewController alloc]init];
self.addressListVC.view.backgroundColor = [UIColor orangeColor];
self.addressHeaderListVC = [[ZCInvoiceHeaderListViewController alloc]init];
self.addressHeaderListVC.view.backgroundColor = [UIColor purpleColor];
[self.contentView addSubview:self.addressHeaderListVC.view];
[self addChildViewController:self.addressHeaderListVC];
[self.addressHeaderListVC didMoveToParentViewController:self];
self.currentViewController = self.addressHeaderListVC;
// 切换各个不同的控制器视图
- (void)switchController:(UIViewController *)oldController newController:(UIViewController *)newController
{
/**
* transitionFromViewController:toViewController:duration:options:animations:completion:
* fromViewController 当前显示在父视图控制器中的子视图控制器
* toViewController 将要显示的姿势图控制器
* duration 动画时间(这个属性,old friend 了 O(∩_∩)O)
* options 动画效果(渐变,从下往上等等,具体查看API)
* animations 转换过程中得动画
* completion 转换完成
*/
[self addChildViewController:newController];
[self transitionFromViewController:oldController toViewController:newController duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {
if (finished) {
[newController didMoveToParentViewController:self];
[oldController willMoveToParentViewController:nil];
[oldController removeFromParentViewController];
self.currentViewController = newController;
}else{
self.currentViewController = oldController;
}
}];
}