8

要从代码创建 2 个视图控制器之间的父/子关系,基本上只需执行以下操作:

[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];

其中self是父视图控制器。
但是,如果我想完全从 Interface Builder 中创建相同的关系怎么办?
或者换句话说:有没有办法使用 Interface Builder 重新创建方法 addChildViewController 的行为?
我没有找到很多关于此的文档,这里有一篇关于该主题的未解决的旧帖子:https ://devforums.apple.com/message/455758#455758

如果没有正确设置 addChildViewController 关系,任何旋转方法都不会转发到我的子视图控制器,这是我的问题的来源。

这是我在 IB 所做的:

  1. 将“视图控制器”对象从“对象库”面板拖放到“对象”面板中
  2. 在身份检查器中,我已将其类更改为我的 UIViewController 子类(“Items View Controller”)
  3. 将视图出口连接到控制器
  4. 将所有其他需要的插座连接到控制器(列表名称、表格视图)

图片中的第一个“视图”对象是我的父视图控制器的视图,而不是突出显示的“视图”是子视图控制器(“项目视图控制器”)的视图。

在此处输入图像描述

容器控制器还通过额外的 IBOutlet 保留其子实例:

@property (nonatomic, strong) IBOutlet ItemsViewController *itemsViewController;

谢谢


更新 1:如果我在容器控制器的 viewDidLoad 中手动设置父/子关系,则所有旋转方法都会正确转发给子级。

[self addChildViewController:self.itemsViewController];

但我真的不知道这是否是正确的做法,因为我想用 IB 来做所有事情。


更新 2:感谢@micantox 提示在对象库中使用“容器视图”,我已将我的 xib 文件转换为情节提要,现在子视图控制器已添加到其父级,所以我不必使用 addChildViewController 从代码手动添加它,旋转方法按预期转发。
“容器视图”基本上实现了嵌入 segue,并且仅受 iOS 6 支持。
这是我的 Storyboard 的更新屏幕截图:

在此处输入图像描述

4

3 回答 3

20

为子视图控制器创建容器视图的正确方法是使用对象库中的对象“容器视图”。在视图控制器的场景中拖动一个将为子视图控制器创建一个新场景,该场景可以与父视图控制器分开管理。

于 2013-05-13T13:24:37.040 回答
2

此外,如果您尝试为情节提要中的现有视图控制器创建嵌入 segue,请从容器视图(而不是容器 VC)按住 Control 并拖动到要嵌入的 VC。

于 2013-12-05T18:51:09.590 回答
0

一个非常简单的方法是通过引用它的故事板 ID 来实例化子视图控制器:

UITableViewController *childViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"childViewController"];

[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];

这样,您可以在界面构建器中构建两个视图控制器。您可以在界面生成器中设置故事板 ID:选择视图控制器,您将在身份检查器中看到它的字段。

于 2015-04-28T17:45:44.237 回答