在子视图控制器之间切换
Switching between childviewcontrollers
我有一个父 UIViewController
加载两个不同的子 UIViewControllers
、A 和 B。要加载 A,我这样做:
[self addChildViewController:A];
[self.container addSubview:A.view];
[A didMoveToParentViewController:self];
然后当我想添加 B 时,我将使用相同的代码。我的问题是如何删除 A. 这就是我所需要的吗:
[A removeFromParentViewController];
还是我还需要添加 [A.view removeFromSuperview];
?
在最简单的情况下,将child添加到容器控制器需要三个步骤:
在 parent 上调用 addChildViewController: 并将 child 作为参数传递(例如,[self addChildViewController:childvc])。
添加 child 控制器的视图作为子视图(例如,[self.view addSubview:childvc.view])。
调用 didMoveToParentViewController: 在 child 上以 parent 作为参数(例如,[childvc didMoveToParentViewController:self ]).
要删除 child 视图控制器,步骤几乎(但不完全)镜像:
调用 willMoveToParentViewController: 在 child 上,传递 nil 作为参数(例如,[childvc willMoveToParentViewController:nil])。
删除 child 控制器的视图(例如,[childvc.view removeFromSuperview])。
在 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];
}];
}
- 启动两个视图控制器转换。
- 计算用于执行过渡动画的两个新帧位置。
- 调用 transitionFromViewController:toViewController:duration:options:animations:completion: 方法来执行交换。
- 此方法自动添加新视图,执行动画,然后删除旧视图。执行交换视图的动画步骤。
- 转换完成后,视图层次结构处于最终状态,因此它通过发送最后两个通知来完成操作。
我有一个父 UIViewController
加载两个不同的子 UIViewControllers
、A 和 B。要加载 A,我这样做:
[self addChildViewController:A];
[self.container addSubview:A.view];
[A didMoveToParentViewController:self];
然后当我想添加 B 时,我将使用相同的代码。我的问题是如何删除 A. 这就是我所需要的吗:
[A removeFromParentViewController];
还是我还需要添加 [A.view removeFromSuperview];
?
在最简单的情况下,将child添加到容器控制器需要三个步骤:
在 parent 上调用 addChildViewController: 并将 child 作为参数传递(例如,[self addChildViewController:childvc])。
添加 child 控制器的视图作为子视图(例如,[self.view addSubview:childvc.view])。
调用 didMoveToParentViewController: 在 child 上以 parent 作为参数(例如,[childvc didMoveToParentViewController:self ]).
要删除 child 视图控制器,步骤几乎(但不完全)镜像:
调用 willMoveToParentViewController: 在 child 上,传递 nil 作为参数(例如,[childvc willMoveToParentViewController:nil])。
删除 child 控制器的视图(例如,[childvc.view removeFromSuperview])。
在 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];
}];
}
- 启动两个视图控制器转换。
- 计算用于执行过渡动画的两个新帧位置。
- 调用 transitionFromViewController:toViewController:duration:options:animations:completion: 方法来执行交换。
- 此方法自动添加新视图,执行动画,然后删除旧视图。执行交换视图的动画步骤。
- 转换完成后,视图层次结构处于最终状态,因此它通过发送最后两个通知来完成操作。