1

这是一个 ViewController,它有一个容器视图。请注意,与往常一样,容器只是全屏的一部分。

在此处输入图像描述

所以容器包含右边的VC。例如,它可能是显示部件列表的“部件”。

但是如果我说四个 VC,我想放在那个区域(容器所在的位置)。也许:零件、轮胎、刹车、机油。

当然,在该区域一次只会显示一个。

真正做到这一点的最好方法到底是什么?

过去,我制作了四个容器视图(位置和大小完全相同),只调出我想要的一个,然后手动删除了其他三个。

这里的正确解决方案是什么???

注意——一个相关的问题是,事实上,容器视图可以指向多个 VC吗?(这样你仍然可以“手动”交换,只需要一个而不是五个匹配的容器视图会容易得多。)

最后是在www上找到的一篇相关文章...

http://sandmoose.com/post/35714028270/storyboards-with-custom-container-view-controllers

4

2 回答 2

3

正如预期的那样,您有几个选择。

选项 1 使用 UIPageViewController。然后,您甚至可以在不同的子视图控制器之间滑动,它们只会在需要时加载。

您必须将UIPageViewController's设置dataSource为至少实现以下两种方法的对象:

#pragma mark - UIPageViewControllerDataSource
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
      viewControllerBeforeViewController:(UIViewController *)viewController
{
    // Return the viewController instance _before_ the given viewController or nil when there are no more view controllers to display.

    return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
       viewControllerAfterViewController:(UIViewController *)viewController
{
    // Return the viewController instance _after_ the given viewController or nil when there are no more view controllers to display.

    return nil;
} 

选项 2 为您的容器视图创建一个插座,然后以编程方式添加/删除您要显示的子视图控制器,如下所示:

- (void)setCurrentChildViewController:(UIViewController *)viewController
{
    // Remove existing child
    if (self.currentChildViewController) {
        if (self.currentChildViewController.isViewLoaded) {
            [self.currentChildViewController.view removeFromSuperview];
        }
        [self.currentChildViewController willMoveToParentViewController:nil];
        [self.currentChildViewController removeFromParentViewController];
    }

    // Now add viewController as child
    [self addChildViewController:viewController];
    [viewController didMoveToParentViewController:self];
    viewController.view.frame = self.containerView.bounds;
    viewController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

    [self beginAppearanceTransition:YES animated:NO];
    [self.containerView addSubview:viewController.view];
    [self endAppearanceTransition];

    self.currentChildViewController = viewController;
}

选项 3 隐藏和显示您在问题中描述的子视图控制器,但我宁愿选择选项 1 或 2,具体取决于您的需要。


初学者脚注:

使用 Storyboards,当你加载一个 UIViewController 时,你经常需要使用instantiateViewControllerWithIdentifier:,所以,一个简单的例子

SomeViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"someViewControllerStoryboardID"];
// see method created in option 2
[self setCurrentChildViewController:vc];
于 2014-08-28T14:23:40.937 回答
1

我使用了一个包含滚动视图的分段控件。

容器视图和分段控件是滚动视图的子视图。当我按下分段控件中的一个选项卡时,我使用两种方法删除子视图控制器,显示新的子视图控制器,然后我重新计算新加载的子视图控制器所需的高度并设置滚动视图的自动布局高度约束常量到新值。

于 2014-08-28T14:29:15.313 回答