在childviewcontrollers之间切换

时间:2015-02-28 01:52:45

标签: ios objective-c uiviewcontroller

我有一个父UIViewController,可以加载两个不同的孩子UIViewControllers A B 。要加载 A ,我会:

    [self addChildViewController:A];
    [self.container addSubview:A.view];
    [A didMoveToParentViewController:self];

然后当我想添加 B 时,我会使用相同的代码。我的问题是如何删除 A. 这就是我需要的全部内容:

    [A removeFromParentViewController];

还是我还需要添加[A.view removeFromSuperview];

2 个答案:

答案 0 :(得分:1)

如果您尝试在控制器a和b之间切换,那么您还需要使用此类代码,或类似的代码,在apple docs here

上找到
- (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];
            }];
}
  1. 启动两个视图控制器转换。
  2. 计算用于执行过渡动画的两个新帧位置。
  3. 调用transitionFromViewController:toViewController:duration:options:animations:completion:执行交换的方法。
  4. 此方法自动添加新视图,执行动画,然后删除旧视图。执行动画步骤以交换视图。
  5. 转换完成后,视图层次结构处于最终状态,因此它通过发送最后两个通知来完成操作。

答案 1 :(得分:0)

在最简单的情况下,将子项添加到容器控制器需要三个步骤:

  1. 在父项上调用addChildViewController:并将子项作为参数传递(例如,[self addChildViewController:childvc])。

  2. 将子控制器的视图添加为子视图(例如,[self.view addSubview:childvc.view])。

  3. 调用didMoveToParentViewController:在父项为其参数的子项上(例如,[childvc didMoveToParentViewController:self])。

  4. 要删除子视图控制器,步骤几乎(但不完全)镜像:

    1. 调用willMoveToParentViewController:在子节点上,传递nil作为参数(例如,[childvc willMoveToParentViewController:nil])。

    2. 删除子控制器的视图(例如,[childvc.view removeFromSuperview])。

    3. 在子项上调用removeFromParentViewController(例如,[childvc removeFromParentViewController])。