【问题标题】:Do I have to call addSubview after calling addChildViewController?调用 addChildViewController 后是否必须调用 addSubview?
【发布时间】:2012-04-25 23:58:33
【问题描述】:

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

我必须在拨打addChildViewController之后再拨打addSubview吗?

在拨打removeChildViewController之前我必须先拨打removeFromSuperview吗?

我在 Apple 文档中没有看到任何关于此的内容。 你怎么看?

【问题讨论】:

    标签: iphone ios5 uiviewcontroller interface-builder


    【解决方案1】:

    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

    【讨论】:

    • 该类别非常有用。非常感谢。
    • 正是我想要的!谢谢彼得
    • @Peter-Lapisu,你为什么不在containerAddChildViewContoller方法中调用[childViewController willMoveToParentViewController:self]
    • 基于此资源,INSERTING developer.apple.com/library/ios/featuredarticles/…时不应调用 willMoveToParentViewController:self
    • @bunkerdive 没关系,但是 removeFromParentViewController 或 removeFromSuperview 上没有调用它,所以你必须在删除时自己调用它
    【解决方案2】:

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

    您可以在Apple's docs here中找到一点...这是“容器视图控制器排列其他视图控制器的内容”部分的相关段落:

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

    如果您有访问权限,我强烈建议您观看 WWDC 2011 视频,标题为“实施 UIViewController Containment”(download it from Apple Developer Video Archive)。

    【讨论】:

    • 非常感谢。如果我销毁容器,我是否还必须调用 removeViewFromSuperview?甚至 removeChildViewController?
    • 您对 Apple 文档的引用只能在 archive.org 上找到。您可能希望将其替换为来自 123 的更新报价。
    【解决方案3】:

    补充彼得的答案: 我发现在addSubview 之前调用addChildViewController 的一个原因是,当调用addSubview 时,调用子对象的viewDidLoad,在某些情况下,您会希望正确设置父子层次结构那一点。如果不这样做,在孩子的 viewDidLoad 期间,parentViewController 属性将为 nil。

    【讨论】:

      【解决方案4】:

      以下是 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

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

      【讨论】:

        猜你喜欢
        • 2015-11-27
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2015-08-06
        • 2019-10-09
        • 1970-01-01
        • 2012-11-04
        • 2011-05-19
        相关资源
        最近更新 更多