以编程方式嵌入UIViewController?

30

我设置了一个带有容器视图的UIViewController的Storyboard,以便我可以嵌入另一个UIViewController

在某些情况下,我需要更改嵌入的视图控制器。在我的故事板中,我不能从我的容器视图中有两个segue(只有一个单独的嵌入segue)。这导致我必须通过编程来实现它。

我在我的Storyboard中有没有连接的嵌入segue的容器视图。

现在,从这一点出发,我如何通过编程将我的选择的UIViewController对象嵌入其中?

2个回答

36

您可以通过编程来实现这一点,以下是一个方法,它将获取一个布尔值来作出决定,确定需要将哪个视图控制器添加到容器视图中,然后将实例化一个对象并将其添加到containerView中。

- (void)addViewControllerToContainerView:(BOOL)addVC1
{
// Get storyboard
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"<name of storyboard>" bundle:[NSBundle mainBundle]];
    UIViewController *viewController = nil;
    if (addVC1)
    {
// get viewController with identifier 
        viewController = [storyBoard instantiateViewControllerWithIdentifier:@"<View Controller 1 Identifier>"];
    }
    else
    {
        viewController = [storyBoard instantiateViewControllerWithIdentifier:@"<View Controller 2 Identifier>"];
    }
// lets add it to container view
    [viewController willMoveToParentViewController:self];
    [self.view addSubview:viewController.view];
    [self addChildViewController:viewController];
    [viewController didMoveToParentViewController:self];
// keep reference of viewController which may be useful when you need to remove it from container view, lets consider you have a property name as containerViewController
    self.containerViewController = viewController;
}

当你需要从容器视图控制器中移除视图控制器时,可以这样做:

   [self.containerViewController willMoveToParentViewController:nil];  // 1   
   self.containerViewController.view removeFromSuperView];
   [self.containerViewController removeFromParentViewController];//this line is updated as view is removed from parent view cotnroller istead of its viewcontroller is removed from parentViewController 
   self.containerViewController = nil

关于容器视图控制器的苹果文档


感谢您提供的详细答案。不幸的是,它并不完全符合我的想象。首先,我需要在根UIViewControllerUIView内启用一个UIViewController。这将填充整个视图。其次,如果我将其作为UIView的子视图添加(而不是整个VC视图),它不会遵循自动布局约束,就像从故事板嵌入一样。 - Josh Kahane
这种方法是可行的,这就是为什么有子视图控制器和父视图控制器的概念。当您将一个视图控制器添加为子视图控制器时,所有其他生命周期方法都会在子VC中调用,并且自动布局也会正常工作。 - Adnan Aftab
我已经添加了一个链接到苹果文档,其中描述了如何实现容器视图控制器。 - Adnan Aftab
感谢您的帮助。通过对您建议的代码进行简单修改,我成功地使其正常工作。只需更改我添加子视图控制器的视图并向该视图添加约束即可。再次感谢。 - Josh Kahane
6
在调用addChildViewController之前,你不应该调用willMoveToParentViewController方法,因为系统会自动帮你调用这个方法。来自https://developer.apple.com/reference/uikit/uiviewcontroller/1621381-willmovetoparentviewcontroller:当你的自定义容器调用addChildViewController:方法时,在添加子视图控制器之前,它会自动调用将要移动到父视图控制器的方法(willMoveToParentViewController)。 - JimmyB

0

使用UIPageViewController的Swift版本(我认为这是一个常见的用例)

let pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
// do your PageViewController stuff here (delegate and dataSource)
pageController.willMove(toParent: self)
containerView.addSubview(pageController.view)
pageController.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
            pageController.view.topAnchor.constraint(equalTo: containerView.topAnchor),
            pageController.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
            pageController.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
            pageController.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor)
])
addChild(pageController)
pageController.didMove(toParent: self)

我没有弄清楚如何使用UIPageViewController中包含的UIPageControll,所以最终我使用了自己的实例。但我相信这超出了这个问题的范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接