与两个UINavigationControllers共享相同的UIViewController作为rootViewController

更新:我决定走我的问题不同的路线。 我不使用直接重用相同的UIViewController ,而是使用两个设置为rootViewControllers的 vanilla UIViewController 。 在他们的loadView方法中,他们调用[storyboard instantiateViewControllerWithIdentifier:]来获得以前的UIViewController并将其视图设置为控制器的视图。 无论如何,这可能是首选的方法,因为我需要设置几个variables和委托。

我有一个UITtoryBoardUITabBarController作为入口点与两个UINavigationControllers连接。 每个人都共享一个共同的UIViewController作为他们的根视图控制器。 当应用程序启动时,第一个UITabBarItem被选中并且视图按预期加载。 但是,当我select第二个UITabBarItem时 ,相同的视图不可见。 我看到一个黑色背景的UINavigationBar 。 我是不是做了不正确的故事板界面,还是我需要手动实例化UIViewController通过每个UINavigationController的方法 – 例如loadView?

奇怪的是,这是一个没有人问的问题。 据我所知,不可能共享rootViewController,我认为这无疑是一个错误,因为当你检查故事板上的连接,你可以看到视图控制器连接到两个导航控制器。 我认为这是一个故事板的缺陷,因为复制viewControllers并重新应用所有的连接是相当容易出错的,并使故事板过于复杂。

我看到你的问题的解决scheme。 像这样的解决方法让我质疑,如果iOS中的当前故事板function准备创build应用程序。 我认为故事板有一个概念上的问题,苹果公司需要决定一个故事板上的viewController是代表一个实例,还是代表一个实例,现在它是不一致的,因为你可以看到多个实际上可以指向同样的viewController,但是实际上每个segue都有自己的实例,为什么这个rootViewController连接也不能跟着呢?我不知道。

就像一个笔记,你的解决scheme考虑从苹果的文档中的以下内容:

“重要视图控制器是它的视图和它创build的子视图的唯一所有者,它负责创build这些视图并在适当的时候放弃它们的所有权,包括在内存不足和视图控制器本身被释放的时候。如果你使用storyboard或者nib文件来存储你的视图对象,那么在视图控制器要求的时候,每个视图控制器对象都会自动获得这些视图的副本,但是,如果你手动创build视图,你不应该使用与多个视图控制器相同的视图对象“。

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

绝对是故事板中的一个错误。 另一种方法是为每个UINavigationController创build基本的UIViewControllers ,然后在每个基本视图控制器中都有一个指向相同UIViewControllerUIContainerView

我认为最简单的解决scheme是在故事板中为您的导航控制器设置没有根视图控制器,然后使用您的导航控制器做这样的事情:

 - (void)viewDidLoad { [super viewDidLoad]; UIViewController *topVC = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"myTopVC"]; [self pushViewController:topVC animated:NO]; } 

首推VC成为根。