我注意到一些非常奇怪的事情,当我将一个子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
的经验吗?或者可以解释差异的来源以及如何摆脱它?
答案 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
无关,因为它从未以这种方式引用。
这有意义吗?