在子视图控制器之间切换

Switching between childviewcontrollers

我有一个父 UIViewController 加载两个不同的子 UIViewControllersAB。要加载 A,我这样做:

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

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

    [A removeFromParentViewController];

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

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

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

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

  3. 调用 didMoveToParentViewController: 在 child 上以 parent 作为参数(例如,[childvc didMoveToParentViewController:self ]).

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

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

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

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

如果您尝试在控制器 a 和 b 之间切换,那么您还需要使用此代码或类似的代码,可在苹果文档中找到 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. 转换完成后,视图层次结构处于最终状态,因此它通过发送最后两个通知来完成操作。