UIViewController子控制器管理

UIViewController的控制器管理:

iOS5以后,苹果新的API增加了addChildViewController方法,建议在addSubview的同时调用addChildViewController方法将子页面对应的控制器也加到当前ViewController的管理中。对于那些当前暂时不需要显示的subview,只通过addChildViewController把Controller加进去。需要显示时再调用transitionFromViewController方法。

另外,当收到系统的 Memory Warning 的时候,系统也会自动把当前没有显示的 subview unload 掉,以节省内存。

  • 添加控制器过程:

    //addChildViewController将viewController加入到self的childViewControllers数组里面。
    [self addChildViewController:viewController];
    //将viewController的view定制frame之后加入到self.view上。
    viewController.view.frame = self.view.bounds;
    [self.view addSubview:viewController.view];
    //将self作为参数发送消息给viewController。子控制器的添加结束,生命周期将会正常随父控制器调用。
    [viewController didMoveToParentViewController:self];
    

    注意:child controller的view可以加入到parent controller的view上或者其任意subview上。但不可以加入到以外的view上;在addChildViewController:方法中将自动帮你调用willMoveToParentViewController:,不要再显示调用。只需在结束时调用didMoveToParentViewController:即可。

  • 移除控制器过程:

     //发送消息给self(child controller),将要从parent controller上移除。参数必须是nil
     [self willMoveToParentViewController:nil];
     //移除view
      [self.view removeFromSuperview];
     //从parent controller的childControllers数组中移除
     [self removeFromParentViewController];
    

注意:在removeFromParentViewController中将自动帮你调用didMoveToParentViewController:方法。不要再显示调用。

  • 切换控制器过程:
    [fromViewController willMoveToParentViewController:nil];
    [self addChildViewController:toViewController];
    __weak typeof(self) weakSelf = self;
    [self transitionFromViewController:fromViewController
    toViewController:toViewController
    duration:duration
    options:options
    animations:animations
    completion:^(BOOL finished)
    {
    [fromViewController removeFromParentViewController];
    [toViewController didMoveToParentViewController:weakSelf];
    if (completion) {
    completion(finished);
    }
    }];

注意:这个方法为两个页面切换提供了animation定制,这个可以方便在非交互情况下的切换时提供了一种动画解决方案;要切换的页面要先addChildViewController:到parent controller上。

推荐阅读更多精彩内容