调用addChildViewController之后,我必须调用addSubview吗?

我试图创build一个容器视图控制器使用iOS5和新的方法,如addChildViewController

调用addChildViewController之后,是否必须调用addSubview

在调用removeChildViewController之前,我必须调用removeFromSuperview吗?

我在苹果文档中没有看到任何关于此的信息。 你怎么看?

简短的回答:“是的,是的。” 视图层次结构和视图控制器层次结构仍然是独立的。 遏制API只允许其他控制器的视图以干净和一致的方式在父控制器的视图中呈现自己。

您可以在这里find苹果的文档 …这是“容器视图控制器安排其他视图控制器的内容”部分的相关内容:

容器像其他视图控制器一样pipe理视图层次结构。 容器还可以将其任何子级的视图添加到其视图层次结构中。 容器决定何时添加这样的视图,以及如何调整容器以适应容器的视图层次结构,否则子视图控制器仍然对视图及其子视图负责。

如果您有权访问,我强烈build议查看题为“实现UIViewController控制”的WWDC 2011video( 在Safari中观看 | 在iTunes中查看 )。

1)调用addChildViewController之后,我必须调用addSubview吗?

2)我必须在调用removeChildViewController之前调用removeFromSuperview?

不完全的

你应该调用removeFromParentViewController:而不是removeChildViewController:你也应该调用willMoveToParentViewController:

添加/删除,你可以参考这个伟大的类别:

UIViewController +容器

 - (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]; } 

在developer.apple.com的官方资源

添加到彼得的答案:我发现在addSubview之前调用addChildViewController一个原因是,当addSubview被调用,然后调用子get的viewDidLoad ,并在某些情况下,你会希望在那个时候正确设置父子层次结构。 如果没有这样做,在child的viewDidLoad中,parentViewController属性将为零。