iOS - 以编程方式设置 UIContainerView 的嵌入式 UIViewController
iOS - Programmatically Set A UIContainerView's Embedded UIViewController
我有一个 UIViewController
,里面有一个 UIContainerView
。基于某个条件是否为真,我想以编程方式将容器视图的嵌入视图设置为不同的 UIViewController
。我注意到你只能有一个嵌入 segue 来设置一个 UIViewController
,那么有没有办法做到这一点?
我尝试将我的容器视图设置为出口,但我找不到任何设置嵌入式 UIViewController
的方法。任何关于如何开始使用的建议都将不胜感激。
如果你的意思是交换 UIViews
和 UIViewController
,我认为你的想法是错误的(希望我理解你的想法)。
A UIViewController
应该有 1 个设计 UIView
并且应该管理该视图的值。正如您所说,您可以使用 Containers
,但是您应该在其视图中添加 UIViewController
,因此有一个实例可以管理该视图。你的第一个 UIViewController
应该只 add/remove 那 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 以及何时隐藏它。
如果我误解了你的问题,请评论,我会删除这个答案。
灵感来自 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)
}
}
我有一个 UIViewController
,里面有一个 UIContainerView
。基于某个条件是否为真,我想以编程方式将容器视图的嵌入视图设置为不同的 UIViewController
。我注意到你只能有一个嵌入 segue 来设置一个 UIViewController
,那么有没有办法做到这一点?
我尝试将我的容器视图设置为出口,但我找不到任何设置嵌入式 UIViewController
的方法。任何关于如何开始使用的建议都将不胜感激。
如果你的意思是交换 UIViews
和 UIViewController
,我认为你的想法是错误的(希望我理解你的想法)。
A UIViewController
应该有 1 个设计 UIView
并且应该管理该视图的值。正如您所说,您可以使用 Containers
,但是您应该在其视图中添加 UIViewController
,因此有一个实例可以管理该视图。你的第一个 UIViewController
应该只 add/remove 那 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 以及何时隐藏它。
如果我误解了你的问题,请评论,我会删除这个答案。
灵感来自 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)
}
}