我正在尝试使用iOS5
和addChildViewController
等新方法创建容器视图控制器。
拨打addSubview
后,我是否必须致电addChildViewController
?
在致电removeFromSuperview
之前,我是否必须致电removeChildViewController
?
我在Apple文档中没有看到任何相关内容。 你觉得怎么样?
答案 0 :(得分:83)
1)调用addChildViewController后是否必须调用addSubview?
是
2)我是否必须在调用removeChildViewController之前调用removeFromSuperview?
不完全
您应该拨打removeFromParentViewController:
而不是removeChildViewController:
您还应该致电willMoveToParentViewController:
要添加/删除,您可以参考以下类别:
- (void)containerAddChildViewController:(UIViewController *)childViewController {
[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];
}
- (void)containerRemoveChildViewController:(UIViewController *)childViewController {
[childViewController willMoveToParentViewController:nil];
[childViewController.view removeFromSuperview];
[childViewController removeFromParentViewController];
}
答案 1 :(得分:42)
简短回答:“是的,是的。”视图层次结构和视图控制器层次结构仍然是独立的。包含API只允许来自其他控制器的视图以干净和一致的方式呈现在父控制器的视图中。
你可以在Apple's docs here中找到一点......这是“容器视图控制器安排其他视图控制器的内容”部分的相关段落:
容器管理视图层次结构,就像其他视图控制器一样。容器还可以将其任何子项的视图添加到其视图层次结构中。容器决定何时添加这样的视图以及如何调整大小以适合容器的视图层次结构,否则子视图控制器仍然负责视图及其子视图。
如果您有权限,我强烈建议您查看WWDC 2011视频“实施UIViewController遏制”(watch in Safari | view in iTunes)。
答案 2 :(得分:3)
加入彼得的答案:
我发现在addChildViewController
之前调用addSubview
的一个原因是,当addSubview
被调用时,孩子的viewDidLoad
被调用,在某些情况下,您会希望拥有在此时正确设置的父子层次结构。如果没有这样做,在child的viewDidLoad中,parentViewController属性将为nil。
答案 3 :(得分:0)
以下是Apple文档提供的示例。
- (void) displayContentController: (UIViewController*) content {
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
您还可以查看此处给出的详细说明- https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
这将使您了解子视图控制器和父视图控制器的关系以及如何使用它们。