Partage du même UIViewController que rootViewController avec deux UINavigationControllers

Mise à jour: j'ai décidé d'emprunter un path différent avec mon problème. Au lieu d'essayer de réutiliser le même UIViewController directement, j'utilise deux UIViewControllers vanilla qui sont définis comme rootViewControllers . Dans leurs methods loadView , ils lancent un appel à [storyboard instantiateViewControllerWithIdentifier:] pour get l'ancien UIViewController et définir leurs vues dans la vue du controller. C'est probablement l'approche préférée de toute façon, puisque j'ai besoin de définir plusieurs variables et delegates.

J'ai un UIStoryBoard avec un UITabBarController comme point d'input connecté avec deux UINavigationControllers . Chacun d'entre eux partage un UIViewController commun en tant que controller de vue racine. Lorsque l'application démarre, le premier UITabBarItem est sélectionné et la vue est chargée comme prévu. Cependant, lorsque je sélectionne le deuxième UITabBarItem , la même vue n'est pas visible. Je vois le UINavigationBar avec un fond noir. Est-ce que je fais quelque chose de mal avec l'interface Storyboard, ou ai-je besoin d'instancier manuellement le UIViewController via la méthode de chaque UINavigationController – loadView par exemple?

Curieusement, c'est une question que personne d'autre ne pose. Autant que je sache, il n'est pas possible de partager le rootViewController, qui est sans aucun doute un bug puisque lorsque vous inspectez la connection sur le storyboard, vous pouvez voir que le controller de vue est connecté aux deux controllers de navigation. Je considère cela comme une faille dans le storyboard car la duplication des viewControllers et la réapplication de toutes leurs connections sont très sujettes aux erreurs et rendent les storyboards trop complexes.

Je vois votre solution au problème. Des solutions de contournement comme celle-ci me font douter si la fonctionnalité de storyboard actuelle dans iOS est prête pour créer des applications. Je pense qu'il y a un problème conceptuel avec les storyboards, Apple doit décider si un viewController sur un storyboard représente une instance ou s'il ne représente que la class, pour le moment il n'est pas cohérent comme vous pouvez le voir le même viewController mais en réalité chaque segue a sa propre instance, pourquoi cela n'est pas également suivi pour les connections rootViewController ?, je ne sais pas.

Juste comme une note, avec votre solution prendre en count les éléments suivants de la documentation d'Apple:

"Important Un controller de vue est le seul propriétaire de sa vue et de toutes les sous-vues qu'il crée, il est responsable de la création de ces vues et de leur renonciation aux moments appropriés, y compris en cas de memory insuffisante et lorsque le controller de vue est libéré Si vous utilisez un storyboard ou un file nib pour stocker vos objects vue, chaque object controller de vue obtient automatiquement sa propre copy de ces vues lorsque le controller de vue les request.Toutefois, si vous créez vos vues manuellement, vous ne devez jamais utiliser le mêmes objects de vue avec plusieurs controllers de vue. "

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

Certainement un bug dans Storyboards. Une autre façon de procéder est de créer des UIViewControllers base pour chaque UINavigationController , puis d'avoir un UIContainerView qui pointe vers le même UIViewController dans chacun des controllers de vue de base.

Je pense que la solution la plus simple consiste à ne définir aucun controller de vue racine pour votre controller de navigation dans le storyboard, puis à faire quelque chose comme ça avec votre controller de navigation:

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

Le VC premier-poussé devient la racine.