如何在界面构建器中创建容器/子视图控制器关系

8
要在代码中创建两个视图控制器之间的父子关系,基本上只需要做类似以下的事情:
[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];

self 是父视图控制器。
但是,如果我想完全通过界面生成器创建相同的关系呢?
换句话说:是否有一种方法可以使用界面生成器重新创建 addChildViewController 方法的行为?我没有找到很多关于这方面的文档,这里是一个有关该主题的旧未解决帖子:https://devforums.apple.com/message/455758#455758

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

这是我在 IB 中所做的:

  1. 从“对象库”面板中拖放“视图控制器”对象到“对象”面板中
  2. 在标识检查器中,我将其类更改为我的 UIViewController 子类(“Items View Controller”)
  3. 将 view outlet 连接到控制器
  4. 将所有其他必需的 outlets 连接到控制器(列表名称、表格视图)

图片中的第一个“View”对象是父视图控制器的视图,而突出显示的“View”是子视图控制器(“Item View Controller”)的视图。

enter image description here

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

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

谢谢


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

[self addChildViewController:self.itemsViewController];

但是我不确定这是否是正确的方法,因为我想使用IB完成所有操作。


更新2: 感谢 @micantox 提供的提示,使用“容器视图”在对象库中,我已将我的xib文件转换为一个Storyboard,现在子视图控制器已经添加到其父视图控制器中,因此我不必手动使用addChildViewController从代码中添加它并且旋转方法按预期转发。
"容器视图"基本上实现了嵌入式转场,仅支持iOS 6及以上版本。
这是我的Storyboard的更新截图:

enter image description here

3个回答

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

据我所知,容器视图控制器不仅限于iPad,在iPhone上也可用链接,我在多个应用程序中使用过它。在这种情况下,我想在iPad上这样做。 - ggould75
无论如何,在界面构建器中完成此操作的方法是通过对象库中的“容器视图”对象!这将允许您单独管理子视图控制器的视图。 - micantox
谢谢,我不知道这个对象的存在,实际上我正在使用单个xib文件而不是故事板,而且它似乎只在故事板上可用。我会尝试一下... - ggould75
1
Storyboard + Container View 对象解决了我的问题!我已经更新了原始答案。 - ggould75

2

另外,如果您正在尝试创建一个嵌入式segue到故事板中现有的视图控制器,则应该从容器视图而不是容器VC向要嵌入的VC进行控件拖动。


0
一个非常简单的方法就是通过引用其故事板ID来实例化子视图控制器:
UITableViewController *childViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"childViewController"];

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接