具有相同根视图的导航控制器

时间:2014-08-05 08:56:46

标签: ios uinavigationcontroller uitabbarcontroller rootview

因此,假设您需要一些需要下一个故事板的功能。例如,您需要上传不同的内容才能查看,具体取决于单击的选项卡。 storyboard

但是当你尝试使用这个故事板时问题出现了。当您切换标签时,您会收到此行为。 bad behaviour

但在第一个标签中一切都很好。所以看起来它没有第二次加载视图。在这种情况下,有人可以解释或给出导航控制器行为的链接,因为我找不到任何有用的参考。或者我应该如何在IB中或以编程方式更正此行为?
谢谢。

4 个答案:

答案 0 :(得分:2)

一个简单的解决方法是将“假视图控制器”作为第二个导航的根目录。在这个“假”控制器上执行viewDidLoad a [self performSegueWithIdentifier:@“goToTheControllerHereWeGo”sender:self];

答案 1 :(得分:1)

所以,正如我在评论中提到的,我认为这是一个错误,但我们会看到Apple如何回应。但是,segues不喜欢视图控制器,它们是多个导航控制器的根视图控制器。根据其出现的上下文,有许多变通方法。

最佳解决方法:共享导航控制器,而不是其根视图控制器

因此,对于上面给出的简单示例,您可以执行此操作,一切都会好的:

A UITabbarController with the same navigation controller for two tabs

其他解决方法:此解决方案更适用于可能具有不同自定义导航控制器的复杂故事板,因此无法共享导航控制器。这个问题的一个搞笑方面是,当一个视图控制器在故事板中有两个父导航控制器时,你不会知道直到运行时哪个得到它!而且,在不同的运行中,他们可以切换:P(另一个原因,我认为这是一个错误)。

来自prepareForSegue的Sooooo你可以检查你的导航控制器是否已经使用rootViewController解压缩,如果没有,请自行强制执行:

UINavigationController* nc = segue.destinationViewController ;
if (nc.viewControllers.count == 0) {
    nc.viewControllers = @[[self.storyboard instantiateViewControllerWithIdentifier:@"MyDetailVC"]];
} 

答案 2 :(得分:-1)

在评论旁边提供更多解释'您不能将UIViewController设置为两个不同导航控制器的根视图控制器。假设您可以这样做,那么控制器的视图将是两个导航控制器视图的子视图。它不可能发生在"它"不能是A的孩子,但同时也是B的孩子。

答案 3 :(得分:-1)

tabview项目在什么条件下切换,还会触发两个独立视图控制器中的一个?逻辑是什么?什么时候实施?无论逻辑是什么,为什么单个视图控制器(让我们假设它根据根填充不同的数据)有两个独立的根?我们不能单独从导航控制器本身添加任何东西, 导航控制器是设置故事板运动的流程,但将VC作为两个不同NC的子视图是没有意义的。

想象这样, 导航控制器本身不提供其他信息,它只是设置动态。那你为什么要把VC作为2root NC的孩子。 更容易认为它是多重继承,在objc中,java因为它不可能 钻石问题。查阅它,我希望它有助于你理解