更新:我已决定针对我的问题采取不同的路线。
我没有尝试直接重用相同的 UIViewController ,而是使用两个设置为 rootViewControllers 的vanilla UIViewControllers 。在 loadView 方法中,他们调用[storyboard instantiateViewControllerWithIdentifier:]
来获取前 UIViewController 并将其视图设置为控制器的视图。这可能是首选的方法,因为我需要设置几个变量和委托。
我有 UIStoryBoard ,其中 UITabBarController 作为与两个 UINavigationControllers 连接的入口点。每个人都共享一个共同的 UIViewController 作为他们的根视图控制器。应用启动时,会选择第一个 UITabBarItem ,并按预期加载视图。但是,当我选择第二个 UITabBarItem 时,相同的视图不可见。我看到带有黑色背景的 UINavigationBar 。我是在使用Storyboard界面做错了什么,还是需要通过每个 UINavigationController的方法手动实例化 UIViewController - 例如loadView?
答案 0 :(得分:10)
奇怪的是,这是一个没有人问的问题。据我所知,不可能共享rootViewController我认为毫无疑问是一个bug,因为当你检查故事板上的连接时,你可以看到视图控制器连接到两个导航控制器。我认为这是故事板中的一个缺陷,因为复制viewControllers并重新应用它们的所有连接非常容易出错,并且会使故事板过于复杂。
我看到了你解决问题的方法。这样的解决方法让我怀疑iOS中的当前故事板功能是否已准备好创建应用程序。我认为故事板存在概念性问题,Apple需要决定故事板上的viewController是否代表一个实例,或者它是否只代表类,现在它不一致,因为你可以看到多个segues实际上可以指向相同的viewController但实际上每个segue都有自己的实例,为什么rootseController连接也没有这个呢?我不知道。
正如请注意,您的解决方案会考虑Apple的文档中的以下内容:
“重要信息视图控制器是其视图及其创建的任何子视图的唯一所有者。它负责创建这些视图并在适当的时间放弃它们的所有权,包括在低内存条件下和视图控制器时如果您使用故事板或nib文件来存储视图对象,则每个视图控制器对象在视图控制器要求时自动获取这些视图的副本。但是,如果您手动创建视图,则应该永远不要使用具有多个视图控制器的相同视图对象。“
答案 1 :(得分:3)
绝对是故事板中的错误。另一种方法是为每个UIViewControllers
创建基本UINavigationController
,然后在每个基本视图控制器中指向UIContainerView
UIViewController
。
答案 2 :(得分:3)
我认为最简单的解决方案是在故事板中为导航控制器设置无根视图控制器,然后使用导航控制器执行类似的操作:
- (void)viewDidLoad
{
[super viewDidLoad];
UIViewController *topVC = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"myTopVC"];
[self pushViewController:topVC animated:NO];
}
第一次推送的VC成为根。