我一直在研究这个问题但是找不到我需要的东西。我想学习如何以编程方式使用子视图控制器创建容器视图。我仍然相当新,并且学习基础知识,但是根据我收集的内容,过去常常使用可恢复的视图并在将容器视图对象添加到库之前将它们附加到子视图控制器(对吗?),我正在寻找一个教程或示例代码,显示如何从头开始,使用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];
}
这样工作正常。我点击按钮和一个红色正方形,子视图控制器,占据屏幕的一小部分出现。我想知道的是,这是最佳做法。
答案 0 :(得分:5)
基本上这涉及到1 Parent
View Controller,它将协调他的子视图控制器的外观。
老实说,我觉得这部分Apple Docs非常完整。
来自相同文档的引用:
将子视图控制器添加到您的内容
要以编程方式将子视图控制器合并到您的内容中,请通过执行以下操作在相关视图控制器之间创建父子关系:
- 调用容器视图控制器的addChildViewController:方法。 此方法告诉UIKit您的容器视图控制器现在正在管理子视图控制器的视图。
- 将子视图的根视图添加到容器的视图层次结构中。 永远记住在这个过程中设置孩子框架的大小和位置。
- 添加任何约束来管理子视图的大小和位置。
- 调用子视图控制器的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。
答案 1 :(得分:0)
- (void)addViewControllerToContainer:(UIViewController *)viewController {
[self addChildViewController:viewController];
viewController.view.frame = self.container.bounds; //important!!
[self.container addSubview:mapVC.view];
[viewController didMoveToParentViewController:self];
}