UIViewController中的addChildViewController使用备忘

作者: shaneZhang 分类: ios技术 发布时间: 2016-01-28 10:20

苹果在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;
        }
    }];
}

如果觉得我的文章对您有用,请随意打赏。如果有其他问题请联系博主QQ(909491009)或者下方留言!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注