美文网首页
添加、删除子控制器的正确调用顺序

添加、删除子控制器的正确调用顺序

作者: 毅个天亮 | 来源:发表于2017-07-05 13:07 被阅读102次

添加子控制器步骤

  1. 添加子控制器视图:[container.view addSubView:childController.view]

1.1 添加子控制器[container addChildViewController:childController]

1.2 [childController didMoveToParentViewController:container]

容器控制器添加子控制器,子控制器的willMoveToParentViewController: 方法会自动被调用,但需要告诉系统何时添加完毕,必须手动调用子控制器的didMoveToParentViiewController:

删除子控制器步骤

2.1移除视图[childController.view removeFromSuperview]

2.2[childController willMoveToParentViewController:nil]

2.3移除控制器[childController removeFromParentViewController]

先将自控器的视图从容器控制器视图中移除,在删除自控制器 之前 需要先调用子控制器的willMoveToParentViewController: 方法传入nil参数,之后才调用子控制器的removeFromParentViewController 方法,remove方法将自动调用willMoveToParentViewController 方法,无需手动调用。


- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(5_0);

这个方法比较有迷惑性,需要注意查看上面的注释说明,这个方法其实是用来管理view hierarchy,并不会影响 view controller hierarchy,所以这里你仍然需要自己管理view controler hierarchy。这个方法同时也比较有用,比如在切换child view controller的显示时,这个方法更加好用,可以参考官方guide中的代码实现:


- (void) cycleFromViewController: (UIViewController*) oldC

toViewController: (UIViewController*) newC

{

  [oldC willMoveToParentViewController:nil];                        // 1

  [self addChildViewController:newC];

  newC.view.frame = [self newViewStartFrame];                      // 2

  CGRect endFrame = [self oldViewEndFrame];

  [self transitionFromViewController: oldC 
                    toViewController: newC  // 3
                                 duration: 0.25 
                                  options:0
                               animations:^{

                                   newC.view.frame = oldC.view.frame;                      // 4
                                  oldC.view.frame = endFrame;

                                }
                               completion:^(BOOL finished) {
                                [oldC removeFromParentViewController];                  // 5
                                [newC didMoveToParentViewController:self];
  }];

}

相关文章

网友评论

      本文标题:添加、删除子控制器的正确调用顺序

      本文链接:https://www.haomeiwen.com/subject/idqqhxtx.html