调用addChildViewController后是否必须调用addSubview?

时间:2012-04-13 15:36:44

标签: iphone ios5 uiviewcontroller interface-builder

我正在尝试使用iOS5addChildViewController等新方法创建容器视图控制器。

拨打addSubview后,我是否必须致电addChildViewController

在致电removeFromSuperview之前,我是否必须致电removeChildViewController

我在Apple文档中没有看到任何相关内容。 你觉得怎么样?

4 个答案:

答案 0 :(得分:83)

1)调用addChildViewController后是否必须调用addSubview?

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

不完全

您应该拨打removeFromParentViewController:而不是removeChildViewController: 您还应该致电willMoveToParentViewController:

要添加/删除,您可以参考以下类别:

UIViewController + Container

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

}

Official resource at developer.apple.com

答案 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

这将使您了解子视图控制器和父视图控制器的关系以及如何使用它们。