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

Posted

技术标签:

【中文标题】具有相同根视图的导航控制器【英文标题】:Navigation Controllers with the same root view 【发布时间】:2014-08-05 08:56:45 【问题描述】:

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

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

但在第一个选项卡中一切正常。所以看起来它不会第二次加载视图。在这种情况下,有人可以解释或提供导航控制器行为的链接,因为我找不到任何有用的参考。或者我应该如何在 IB 中或以编程方式纠正这种行为? 谢谢。

【问题讨论】:

您需要更具体地了解您的问题。如果您以编程方式完成任何操作,请向我们展示您的代码,并在询问之前尝试自己调试。 @Neeku 我什么也没做。这只是故事板中的示例,它不能正常工作。 你不能将 UIViewController 作为两个不同 Navigation 控制器的根视图控制器。 @Danyun 你能解释一下为什么吗?我对 ios 有点陌生,实际上我不明白为什么第二个导航栏不能创建 UIViewController 的实例。这不是类的层次结构——它只是视图的变化方式。我需要根据单击的选项卡更改同一视图控制器的内容。我无法复制它,因为在实际项目中我有更大的序列和视图序列,所以这是不可能的。 我实际上正准备向 Apple 提交一份雷达报告。仅仅因为我有一种复杂的方式可以通过两种方式访问​​同一个视图控制器(一种是模态的,另一种是作为拆分视图的细节控制器),这让我很伤心。花了很长时间才弄清楚为什么导航控制器在没有子视图控制器的情况下出现在 segues 中。当然,一旦我终于找到了问题,我就会发现这篇关于堆栈溢出的帖子。 【参考方案1】:

一个简单的解决方法是将“fake-viewcontroller”作为第二次导航的根。在这个“假”控制器上,在 viewDidLoad 中执行 [self performSegueWithIdentifier: @"goToTheControllerHereWeGo" sender: self];

【讨论】:

【参考方案2】:

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

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

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

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

您可以在 prepareForSegue 中检查您的导航控制器是否使用 rootViewController 解压,如果没有,请自行将其强制放入其中:

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

【讨论】:

【参考方案3】:

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

【讨论】:

希望我的解释有所帮助。【参考方案4】:

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

这样想, 导航控制器本身不提供额外的信息,它只是让事情动起来。那么,为什么要将 VC 作为 2root NC 的子级。 更容易认为它是多重继承,在objc,java中它是不可能的,因为 钻石问题。查一下,希望能帮助你理解

【讨论】:

您的回答看起来很激进。顺便说一句,我知道钻石问题并理解它,但它不是多重继承,它只是关系。你写 - 无论逻辑 - 购买的人都想要这种方式 - 这是一个很好的理由吗?够了,我想。我得到了标签栏和导航栏,并在两种标签栏情况下得到了相同的控制器。所以让我们回到问题,而不是原因。关于 Diamond 问题 - 它在 C++ 中解决,但在 Java 中没有。所以这不是一个很好的例子。

以上是关于具有相同根视图的导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

弹出到根视图控制器时导航栏消失

在容器视图中具有静态表的导航控制器

如何在根视图中隐藏导航控制器?

导航控制器内的标签栏控制器,或共享导航根视图

交替使用拆分视图控制器和导航控制器作为窗口根视图控制器

返回导航到根视图控制器后,折叠的大标题导航栏变得展开