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

时间:2015-05-27 06:57:12

标签: ios objective-c xcode uiviewcontroller uicontainerview

我的UIViewController里面有UIContainerView。根据某个条件是否属实,我想以编程方式将容器视图的嵌入视图设置为不同的UIViewController。我注意到你只能有一个嵌入segue来设置一个UIViewController,所以有没有办法完成这个?

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

2 个答案:

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

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