iOS - 以编程方式设置 UIContainerView 的嵌入式 UIViewController

iOS - Programmatically Set A UIContainerView's Embedded UIViewController

我有一个 UIViewController,里面有一个 UIContainerView。基于某个条件是否为真,我想以编程方式将容器视图的嵌入视图设置为不同的 UIViewController。我注意到你只能有一个嵌入 segue 来设置一个 UIViewController,那么有没有办法做到这一点?

我尝试将我的容器视图设置为出口,但我找不到任何设置嵌入式 UIViewController 的方法。任何关于如何开始使用的建议都将不胜感激。

如果你的意思是交换 UIViewsUIViewController,我认为你的想法是错误的(希望我理解你的想法)。

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];
}

创建 AViewControllerBViewController。在 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)
    }
}