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

Ios 具有相同根视图的导航控制器,ios,uinavigationcontroller,uitabbarcontroller,rootview,Ios,Uinavigationcontroller,Uitabbarcontroller,Rootview,所以假设您需要一些需要下一个故事板的功能。例如,您需要根据单击的选项卡上载不同的内容以查看。 但是当你尝试使用这个故事板时,问题就出现了。当你切换标签时,你会得到这种行为。 但在第一页,一切都很好。看起来它不会第二次加载视图。在这种情况下,有人能解释一下导航控制器的行为吗?因为我找不到任何有用的参考资料。或者我应该如何在IB中或通过编程纠正这种行为谢谢。请在注释“不能将UIViewController作为两个不同导航控制器的根视图控制器”旁边提供更多解释。假设您可以这样做,那么控制器的视图将

所以假设您需要一些需要下一个故事板的功能。例如,您需要根据单击的选项卡上载不同的内容以查看。

但是当你尝试使用这个故事板时,问题就出现了。当你切换标签时,你会得到这种行为。


但在第一页,一切都很好。看起来它不会第二次加载视图。在这种情况下,有人能解释一下导航控制器的行为吗?因为我找不到任何有用的参考资料。或者我应该如何在IB中或通过编程纠正这种行为
谢谢。

请在注释“不能将UIViewController作为两个不同导航控制器的根视图控制器”旁边提供更多解释。假设您可以这样做,那么控制器的视图将是两个导航控制器视图的子视图。它不能发生,因为“它”不能是a的子对象,但同时也是B的子对象。

在什么情况下,选项卡项会切换,也会触发两个单独的视图控制器之一?逻辑是什么?何时实施?不管逻辑是什么,为什么一个视图控制器(让我们假设它根据根填充了不同的数据)有两个独立的根?除了导航控制器本身,我们无法添加任何内容, 导航控制器是设置脚本运动的流程,但是将VC作为两个不同NC的子视图是没有意义的

像这样想,, 导航控制器本身不提供任何附加信息,它只是设置运动状态。那么你为什么要把一个VC当作2root NC的孩子呢。 更容易认为它是多重继承,在objc中,java是不可能的,因为
钻石问题。查找它,我希望它能帮助您理解

一个简单的解决方法是在第二次导航时使用一个“假viewcontroller”作为根目录。在这个“假”控制器上,在viewDidLoad中执行[self-PerformsgueWithIdentifier:@“goToTheControllerHereWeGo”发送方:self]

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

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

因此,对于上面给出的简单示例,您可以这样做,一切都会很好:

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

因此,在prepareForSegue中,您可以检查导航控制器是否已使用rootViewController解包,如果未解包,请自己强制将其解包:

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

你需要更具体地说明你的问题。如果您以编程方式做过任何事情,请向我们展示您的代码,并在询问之前尝试自己调试。@Neeku我什么也没做。这只是一个仅在故事板中制作的示例,它不能正常工作。您不能将UIViewController作为两个不同导航控制器的根视图控制器。@Danyun您能解释一下为什么吗?我对iOS有点陌生,实际上我不明白为什么第二个导航栏不能创建UIViewController的实例。这不是类的层次结构,而是视图如何变化。我需要根据单击的选项卡更改同一视图控制器的内容。我不能复制它,因为在真实的项目中,我得到了更大的序列和视图,所以这是不可能的。实际上,我正准备向苹果公司提交一份雷达文件。这对我来说很糟糕,因为我有一种复杂的方法,可以通过两种方式(一种是模态方式,另一种是作为分割视图的细节控制器)访问同一个视图控制器。花了很长时间才发现为什么导航控制器在没有子视图控制器的分段中出现。当然,一旦我最终发现了这个问题,我就会发现这篇关于堆栈溢出的文章。希望我的解释能有所帮助。你的回答看起来很有攻击性。顺便说一句,我知道钻石问题并理解它,但这不是多重继承,只是关系。你写——不管逻辑是什么——买东西的人想要这种方式——这是好的理由吗?够了,我想。我得到了tab bar和nav bar,在tab bar的两种情况下得到了相同的控制器。让我们回到问题上来,而不是原因。关于钻石问题——它是用C++解决的,而不是用java解决的。所以这不是一个好例子。