【问题标题】:Container View Controller Programmatically容器视图控制器以编程方式
【发布时间】:2016-05-05 17:52:50
【问题描述】:

我已经研究了一段时间,但找不到我需要的东西。我想学习如何以编程方式使用子视图控制器创建容器视图。我对此仍然很陌生并且学习了基础知识,但是据我所知,这曾经是使用可重用视图并在将容器视图对象添加到库之前将它们附加到子视图控制器来完成的(对吗?),我正在寻找一个教程或示例代码来展示如何从头开始,使用 xib,但没有任何复杂性,比如添加表格单元格等......只是容器和子程序以编程方式。那有意义吗?我敢肯定 S.O. 上一定有什么东西。感谢您的帮助。

更新 ---------------------------------------------- -------------------------------------------------- ---------------------- 我设法创建了一个带有 UIButton 操作的子视图控制器。相关代码:

- (IBAction)Pressed:(id)sender {
    ChildViewController *childViewController = [[ChildViewController alloc]init];
    [self displayContentController:childViewController];
}

- (void) displayContentController: (UIViewController*) content {
    [self addChildViewController:content];
    content.view.frame = CGRectMake(0, 115, 320, 240);
    content.view.backgroundColor = [UIColor redColor];

        CATransition *transition = [CATransition animation];
transition.duration = 1;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[content.view.layer addAnimation:transition forKey:nil];
[self.view addSubview:content.view];
[content didMoveToParentViewController:self];
}

所以这很好。我单击按钮,出现一个红色正方形的子视图控制器,它占据了屏幕的一小部分。我想知道这是否是最佳做法。

【问题讨论】:

    标签: objective-c uicontainerview programmatically-created childviewcontroller


    【解决方案1】:

    基本上,这涉及到拥有 1 个 Parent 视图控制器,他们将协调其子视图控制器的外观。

    说实话,我觉得Apple Docs 在这部分上相当完整。

    引用同一文档:

    将子视图控制器添加到您的内容中

    要以编程方式将子视图控制器合并到您的内容中,请通过执行以下操作在相关视图控制器之间创建父子关系:

    1. 调用容器视图控制器的 addChildViewController: 方法。 这个方法告诉 UIKit 你的容器视图控制器现在正在管理子视图控制器的视图。
    2. 将子视图的根视图添加到容器的视图层次结构中。 永远记得在这个过程中设置孩子框架的大小和位置。
    3. 添加任何约束以管理子视图的大小和位置。
    4. 调用子视图控制器的 didMoveToParentViewController: 方法。

    代码示例:

    - (void) displayContentController: (UIViewController*) content {
       [self addChildViewController:content];
       content.view.frame = [self frameForContentController];
       [self.view addSubview:self.currentClientView];
       [content didMoveToParentViewController:self];
    }
    

    回应有关最佳做法的更新:

    Objc.io 在这方面有一些非常简洁的文章。

    比如文章里讲View Controller Containment的笔记:

    视图控制器应该是可重用且自包含的实体。

    子视图控制器也不例外。在 为了实现这一点,父视图控制器应该只 涉及两个任务:布置子视图控制器的根 视图,并通过其与子视图控制器进行通信 暴露的 API。它不应该修改孩子的视图树或其他 直接内部状态。

    子视图控制器应该包含必要的逻辑来管理它们自己的视图树——不要把它们当作愚蠢的视图。这将导致更清晰的关注点分离和更好的可重用性。

    他们还在使用这种模式时在视图控制器之间谈论transitions

    【讨论】:

    • 是的,谢谢,我已经找到并设法使它工作。不过,我正在努力进行过渡。我应该在问题中说明这一点。“呈现视图控制器”方法不适用于不采用完整视图的控制器,所以我认为 CATransition 是正确的方法吗?我会更新问题。
    • @Paul 查看参考资料/引文。我更喜欢引用一些格式正确的文章,而不是提供相同的解释:) 干杯
    【解决方案2】:
    - (void)addViewControllerToContainer:(UIViewController *)viewController {
    
        [self addChildViewController:viewController];
    
        viewController.view.frame = self.container.bounds; //important!!
        [self.container addSubview:mapVC.view];
    
        [viewController didMoveToParentViewController:self];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2011-05-09
      相关资源
      最近更新 更多