如何使用单个容器视图在多个内容视图和视图控制器之间切换?

时间:2013-10-13 14:33:09

标签: ios uiviewcontroller

道歉,如果这更像是一个最佳实践/你的意见通缉问题,但我甚至不确定这件事是否得到支持,过去几个小时在谷歌上产生了很少有用的见解。反正。

我有一个视图控制器,其中我有一些控件需要保持不变,还有一些其他需要根据这些“固定”控件的状态进行更改。我认为这对于视图容器来说可能是完美的工作:我可以使用不同的控件和东西设计任意数量的不同视图控制器,然后我可以在它们之间切换,将它们放在视图容器中。

所以我把整个事情搞定了,自动布局和所有配件,以及布局的东西都有效(这意味着我做了一些非正统的测试,确认如果我调整视图容器的大小,所有其他的“修复“观点相应地移动。我对它非常满意。

除了似乎没有办法直接从Storyboard同时嵌入多个视图控制器并让包含(外部,超级,无论什么)视图控制器执行适当的segue。好吧,那么,让我们以编程方式进行,这就是我所掌握的最佳知识。

我尝试了一些令人难以置信的愚蠢代码,比如

for(UIViewController *vc in [self childViewControllers]) {
    // I know, I'm just prototyping here...
    [vc.view removeFromSuperview];
    [vc removeFromParentViewController];
}
UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"B_Screen"];
[self addChildViewController:vc];
[_containerView addSubview:vc.view];

_containerView似乎没有适当调整大小。这可能是由于che内容视图从容器视图的最后一个视图到底部都具有“大于或等于”约束的事实,因此如果我的原始内容视图比我用{实例化的那个'更高或更短。 {1}} B_Screen将保留原始版本的大小。

此时,我甚至欣赏RTFM,只要你能指出正确的手册(是的,我已经阅读了“适用于iOS的View Controller编程指南”(虽然我可能错过了一些内容,所以随意拍他们的脸。

一旦整个过程有效,我想设置精彩的动画,比如淡出/淡入或类似的东西,但我想我可以自己动手。

编辑:经过仔细检查,似乎发生了两件事情:内容视图被正确替换,但它没有“拥抱”其内容,这意味着内容空间相当大视图的底部,在其底部和“最后”视图之间。然而,这是显而易见的,因为我在内容视图的底部与最后包含的视图的底部之间存在约束,该视图具有“大于或等于”类型,这意味着20是好的,15很糟糕,但是200和20都很好。但是如果我将它设置为更严格的东西,就像一个正确的“相等”,自动布局会抱怨所有地方存在冲突的约束。这很可能是AL的“错误”(或特征,听起来像预期的行为)。

似乎发生的第二件事是容器视图底部与属于“外部”容器的“第一”视图之间的垂直间距约束被默默地打破(AL什么也没说)在控制台中,如果它必须打破约束或类似的东西),这意味着容器视图只是掩盖了应该向下移动的任何东西。我在滚动视图中,所以我并不关心我的界面有多高。

2 个答案:

答案 0 :(得分:0)

只是猜测,但也许你所缺少的是:

  • - (void)willMoveToParentViewController:(UIViewController *)parent
  • - (void)didMoveToParentViewController:(UIViewController *)parent

它们在Implementing a Container View Controller

部分中有所描述

答案 1 :(得分:0)

我在非常类似的情况下做了什么(带有两个可交换的UIViewControllers的永久导航栏,是使用 UIPageViewController

将其存储为

等属性
@property (nonatomic) UIPageViewController *pageController;

要防止通过滑动切换视图控制器,请使用页面卷曲进行设置并禁用手势识别器

// Somewhere in view did load
UIViewController *initialSubVC = [[UIViewController alloc] ...];
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

// Set initial view controller
[self.pageController setViewControllers:@[initialSubVC] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

// Disable manual swiping
for (UIGestureRecognizer *recognizer in self.pageController.gestureRecognizers) {
    recognizer.enabled = NO;
}

要在视图控制器之间切换,您可以再次使用以下代码,可能是通过单击按钮触发

[self.pageController setViewControllers:@[otherSubVC] direction:0 animated:NO completion:nil];

也许您可以在视图中设置所有视图控制器,并将它们存储在数组中。

我不确定您是否必须设置委托并实施委托方法,因为没有滑动。