在代码或IB中添加子VC时视图层次结构的差异

时间:2017-11-23 14:33:39

标签: ios interface-builder uicontainerview

我注意到一些非常奇怪的事情,当我将一个子VC添加到IB中的视图层次结构时,层次结构看起来像这样

父vc视图
  - - 集装箱视图
  - - - - vc视图

手动添加时

父vc视图
  - - 儿童vc视图

按照apple的说明,在他们的guide中,他们从未将容器视图作为层次结构的一部分进行讨论,但是在实践中的代码中,例如当我试图调用时

    - (void) hideContentController: (UIViewController*) content {
   [content willMoveToParentViewController:nil];
   [content.view removeFromSuperview];
   [content removeFromParentViewController];
}

容器视图仍然是污染"我的视图层次结构我不理解该容器与我的孩子VC之间的关系。

我的代码中的一个实际示例是,我将这些viewControllers放在UIStackView中,并且在尝试删除使用UIViewController插入的Embed Segue时,我留着幻影。我可以找到访问该视图的唯一方法是从故事板中IBOutlet

任何人都有处理,更换或删除添加了IB的ChildViewControllers的经验吗?或者可以解释差异的来源以及如何摆脱它?

1 个答案:

答案 0 :(得分:0)

我会说"容器视图"你可以在IB中使用有点,嗯......误导?

如果在“对象库”窗格中选择它,则会显示一个信息弹出窗口,将其列为UIContainerView。但是,如果您搜索Apple的文档,则无处可寻。

而且,正如您可能已经注意到的那样,如果您将其与IBOutlet连接,则会将其设置为UIView ....如果您尝试执行以下操作:

UIContainerView *vc;

let cv: UIContainerView?

您将获得"使用未声明的类型"错误。

是什么让它"与众不同?仅仅是它在IB中的表现,以及自动"加载和显示"其嵌入式子视图控制器。这很像Segues ......你可以创建和"看"他们在IB;你可以为它们分配属性;在运行时,他们服务于目的/有行动;但是......你无法在代码中创建UISegue

所以...如果你想使用"容器视图的视觉设计和嵌入自动化"在IB中,您需要知道它已作为UIView添加到您的视图层次结构中,并且其.view VC的embedded被添加为 子视图自己 ...如果你想删除它(或者改变它或改变任何其他属性),你需要在运行时使用IBOutlet来引用它它)。

当你看到"仅代码"子视图控制器的实现,您通常 查看用于添加Child VC的视图作为" main"的子视图的代码。查看(或其他一些观点)。它似乎与您在IB中可以使用的UIContainerView无关,因为它从未以这种方式引用。

这有意义吗?