因此,假设您需要一些需要下一个情节提要的功能。例如,您需要根据单击的选项卡上传不同的内容以查看。
但是当你尝试使用这个故事板时,问题就出现了。当你切换标签时,你会得到这种行为。
但在第一个选项卡中一切都很好。所以看起来它不会第二次加载视图。在这种情况下,有人可以解释或提供导航控制器行为的链接,因为我找不到任何有用的参考。或者我应该如何在 IB 中或以编程方式纠正这种行为?
谢谢。
因此,假设您需要一些需要下一个情节提要的功能。例如,您需要根据单击的选项卡上传不同的内容以查看。
但是当你尝试使用这个故事板时,问题就出现了。当你切换标签时,你会得到这种行为。
但在第一个选项卡中一切都很好。所以看起来它不会第二次加载视图。在这种情况下,有人可以解释或提供导航控制器行为的链接,因为我找不到任何有用的参考。或者我应该如何在 IB 中或以编程方式纠正这种行为?
谢谢。
一个简单的解决方法是将“假视图控制器”作为第二次导航的根。在这个“假”控制器上,在 viewDidLoad 中执行 [self performSegueWithIdentifier: @"goToTheControllerHereWeGo" sender: self];
所以,正如我在评论中提到的,我确实认为这是一个错误,但我们会看到苹果如何回应。但是,是的,segues 不喜欢作为多个导航控制器的根视图控制器的视图控制器。根据出现的上下文,有许多解决方法。
最佳解决方法:共享导航控制器,而不是它们的根视图控制器
因此,对于上面给出的简单示例,您可以这样做,一切都会好起来的:
其他解决方法:这个更适用于可能具有不同自定义导航控制器的复杂故事板,因此无法共享导航控制器。这个问题的一个有趣的方面是,当一个视图控制器在故事板中有两个父导航控制器时,直到运行时你才会知道哪个得到它!此外,在不同的运行中,他们可以切换:P(我认为这是一个错误的另一个原因)。
Sooooo 从 prepareForSegue 中,您可以检查您的导航控制器是否使用 rootViewController 解包,如果没有,请自行将其强制其中:
UINavigationController* nc = segue.destinationViewController ;
if (nc.viewControllers.count == 0) {
nc.viewControllers = @[[self.storyboard instantiateViewControllerWithIdentifier:@"MyDetailVC"]];
}
只需在“您不能将 UIViewController 作为两个不同导航控制器的根视图控制器”的注释旁边提供更多解释。假设你可以这样做,那么控制器的视图将是两个导航控制器视图的子视图。它不可能发生,因为“它”不能是 A 的孩子,但同时是 B 的孩子。
tabview 项目在什么情况下切换,也会触发两个单独的视图控制器之一?什么是逻辑?什么时候实施?不管逻辑是什么,为什么单个视图控制器(让我们假设它根据根被不同的数据填充)有两个独立的根?我们不能从导航控制器本身单独添加任何东西,导航控制器是设置故事板运动的流程,但是将 VC 作为两个不同 NC 的子视图是没有意义的。
可以这样想,导航控制器本身并没有提供额外的信息,它只是让事情动起来。那么,为什么要将 VC 作为 2root NC 的子级。更容易认为它是多重继承,在 objc 中,由于 Diamond 问题,java 是不可能的。查一下,我希望它可以帮助你理解