我的UIViewController
里面有UIContainerView
。根据某个条件是否属实,我想以编程方式将容器视图的嵌入视图设置为不同的UIViewController
。我注意到你只能有一个嵌入segue来设置一个UIViewController
,所以有没有办法完成这个?
我尝试将容器视图设置为插座,但我找不到任何设置嵌入式UIViewController
的方法。任何关于如何开始这方面的建议都将不胜感激。
答案 0 :(得分:7)
如果您的意思是交换UIViews
UIViewController
(希望我理解您的构思),我认为您的想法是错误的。
UIViewController
应该有1个设计UIView
并且应该管理该视图的值。如您所说,您可以使用Containers
,但是您应该在其视图中添加UIViewController
,因此有一个实例可以管理此视图。您的第一个UIViewController
应该只添加/删除ChildViewController
。
所以我建议:
在UIViewController上实现一个类别并添加以下方法:
- (void)displayContentController:(UIViewController *)content {
[self addChildViewController:content];
content.view.frame = [[UIScreen mainScreen] bounds];
[self.view addSubview:content.view];
[content didMoveToParentViewController:self];
}
- (void)hideContentController:(UIViewController *)content {
[content willMoveToParentViewController:nil];
[content.view removeFromSuperview];
[content removeFromParentViewController];
}
创建AViewController
和BViewController
。在AViewController
调用(viewDidLoad?):
BViewController *bViewController = [[BViewController alloc] init];
[self displayContentController:bViewController];
在BViewController
中管理此控制器的视图。 AViewController
应该只管理何时显示BViewController以及何时隐藏它。
如果我误解了您的问题,请对其进行评论,我会删除此答案。
答案 1 :(得分:0)
受Vive回答的启发:
extension UIViewController {
func showContentController(_ controller: UIViewController, containerView: UIView? = nil) {
controller.willMove(toParentViewController: self)
self.addChildViewController(controller)
controller.view.frame = (containerView ?? self.view).frame
(containerView ?? self.view).addSubview(controller.view)
controller.view.autoPinEdgesToSuperviewEdges()
controller.didMove(toParentViewController: self)
}
func hideContentController(_ controller: UIViewController) {
controller.willMove(toParentViewController: nil)
controller.removeFromParentViewController()
controller.view.removeFromSuperview()
controller.didMove(toParentViewController: nil)
}
}