【问题标题】:What really is the best way to have MORE THAN ONE controller in a container?在容器中拥有多个控制器的最佳方式是什么?
【发布时间】:2014-08-28 13:58:06
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: ios uiviewcontroller uicontainerview


    【解决方案1】:

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

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

    您必须将UIPageViewControllerdataSource 设置为至少实现这两种方法的对象:

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

    【讨论】:

    • 天哪!我从没想过 UIPageViewController,谢谢!不让它滑动真的很棘手吗? (例如,stackoverflow.com/a/24847685/294884)我只希望它改变,当我这么说的时候……你觉得呢?再次感谢!
    • 重新以编程方式添加/删除子视图。 (顺便说一句,这是很棒的示例代码,谢谢。)它似乎充满了问题..我发现我必须编写一个完整的 VC 子类来巧妙地处理它,你知道吗?我实际上发现,使用方案 3,最好制作一个全新的 VC“多容器容器 VC”!它拥有你的 4 或 5 个 VC,否则它只是一团糟。我很惊讶没有超级简单的解决方案。我要去试试你惊人的 UIPageViewController 想法......
    • @JoeBlow 谢谢!手动添加/删除子 VC 效果很好,但 UIPageViewController 也很有效。要禁用滑动,请查看:stackoverflow.com/a/24847685/171933
    • 我为“初学者”添加了一个小提示(错误 - 我几个小时都没有被这个发现,或者任何事情:))
    【解决方案2】:

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

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

    【讨论】:

    • 你好张!事实上,正如我所说,这就是我目前所做的,基本上是手动换入和换出 VC。我想知道这样做的坏方法! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2021-12-16
    • 2021-08-29
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多