导航控制器与相同的根视图

6
假设您需要一些功能,需要下一个故事板。例如,根据单击的选项卡上传不同的内容来查看。storyboard 但是当您尝试使用此故事板时,问题就出现了。切换选项卡时会出现以下行为。bad behaviour 但在第一个选项卡中一切正常。看起来好像它没有第二次加载视图。有人可以解释或给出导航控制器在这种情况下的行为链接,因为我在参考资料中找不到任何有用的信息。或者我应该如何在IB或以编程方式更正此行为?
谢谢。

你需要更具体地描述你的问题。如果你已经进行了任何编程方面的工作,请向我们展示你的代码,并在提问之前尝试自行调试。 - Neeku
@Neeku 我什么也没做。这只是在Storyboard中制作的示例,它不能正常工作。 - htzfun
你不能将一个UIViewController作为两个不同导航控制器的根视图控制器。 - Danyun Liu
@Danyun,你能解释一下为什么吗?我在iOS方面有点新,实际上我不明白为什么第二个导航栏不能创建UIViewController的实例。这不是类的层次结构 - 这只是视图如何更改。我需要根据单击哪个选项卡来更改同一视图控制器的内容。我无法复制它,因为在实际项目中,我有更大的segue和视图序列,所以这是不可能的。 - htzfun
我实际上正准备向苹果提交一个关于这个问题的报告。这个问题给我带来了很大的困扰,因为我以一种复杂的方式通过两种方式(一种是模态方式,另一种是作为分割视图的详细控制器)访问同一个视图控制器。花了很长时间才发现导航控制器在segue中没有子视图控制器的原因。当然,一旦我终于找到问题所在,就在Stack Overflow上找到了这篇帖子。 - user564904
4个回答

2

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


1

所以,正如我在评论中提到的那样,我认为这是一个错误,但我们会看看苹果如何回应。但是,是的,segue 对于作为多个导航控制器的根视图控制器的视图控制器没有什么爱。根据出现的上下文,有许多解决方法。

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

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

A UITabbarController with the same navigation controller for two tabs

其他解决方法:这个更适用于复杂的storyboard,可能有不同的自定义导航控制器,因此共享导航控制器是不可能的。这个问题的一个滑稽之处在于,当一个视图控制器在故事板中有两个父导航控制器时,你在运行时将不知道哪一个会被使用!而且,在不同的运行中它们还可以切换:P(我认为这是一个bug的另一个原因)。

所以,在prepareForSegue中,您可以检查您的导航控制器是否已经解包了一个rootViewController,如果没有,则强制将其放入其中:

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

-1

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


希望我的解释有所帮助。 - htzfun

-1
在什么条件下,选项卡视图项目会切换,并触发两个单独的视图控制器之一?这是什么逻辑?它是何时实现的?无论逻辑如何,为什么一个单一的视图控制器(假设它根据根填充不同的数据)有2个不同的根?我们不能从导航控制器本身分别添加任何内容, 导航控制器是设置故事板运动的流程,但将VC作为两个不同NC的子视图没有意义。
可以这样想, 导航控制器本身不提供任何额外信息,它只是启动事物。那么为什么要将VC作为2root NC的子级。 更容易地将其视为多重继承,在objc、java中由于钻石问题而不可能。查找一下,希望能帮助您理解。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接