在容器中拥有多于一个控制器的最佳方法是什么?

时间:2014-08-28 13:58:07

标签: ios uiviewcontroller uicontainerview

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

enter image description here

因此容器包含右侧的VC。例如,它可以是显示零件清单的“零件”。

如果我说四个VC,我想放入那个区域(容器所在的位置)。也许:零件,轮胎,制动器,油。

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

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

在过去,我已经制作了四个容器视图(完全相同的位置和大小),只是提出了我想要的那个,并手动删除了其他三个。

这里有什么合适的解决方案???

注意 - 相关的问题确实是容器视图实际上可以指向多个VC 吗? (以这种方式你仍然可以“手动”交换,只需要一个,而不是五个匹配的容器视图就更容易了。)

最后这是一篇关于www ...

的相关文章

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

2 个答案:

答案 0 :(得分: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,具体取决于您的需求。


初学者的脚注:

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

SomeViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"someViewControllerStoryboardID"];
// see method created in option 2
[self setCurrentChildViewController:vc];

答案 1 :(得分:1)

我使用了包含scrollView的分段控件。

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

相关问题