Passer à un autre storyboard?

133

Est-il possible de passer d'un storyboard à un autre ou d'intégrer un storyboard dans un contrôleur de vue dans un autre storyboard? J'ai besoin de placer un UITabBarControllerdans un UINavigationController, et j'aimerais les garder bien séparés.

Ry-
la source
1
Regardez cette réponse stackoverflow.com/a/19702425/317928
vokilam
5
Excellente question. Avoir un storyboard est un cauchemar pour les projets en équipe. Nous divisons régulièrement les projets en storyboards par "flux" (un storyboard pour la connexion, un storyboard pour le fil d'actualité et les écrans associés, etc.). Cela permet de minimiser le nombre de conflits de fusion, qui se produiraient autrement chaque fois qu'un développeur touche le storyboard.
Brian Sachetta
@BrianSachetta Que faites-vous d'autre? D'autres bons conseils similaires à partager?
Honey
Cela dépend de la structure de votre équipe. Si vous le souhaitez vraiment, vous pouvez avoir toutes vos interfaces utilisateur dans des fichiers .xib séparés. C'était comme ça avant que les storyboards n'existent. Il y a des avantages et des inconvénients à cette approche. L'avantage est que vous n'aurez presque jamais de conflits avec d'autres développeurs sur le projet. L'inconvénient est qu'il peut être difficile de voir visuellement le flux de l'application.
Brian Sachetta

Réponses:

201

Oui, mais vous devez le faire par programme:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];
lnafziger
la source
11
Je veux juste vraiment garder les storyboards séparés; ils sont déjà beaucoup trop encombrés.
Ry-
11
Tout comme les chapitres d'un livre, je vois la nécessité de plusieurs storyboards.
finneycanhelp
48
Lorsque plusieurs développeurs travaillent sur la même application, il devient très utile d'avoir plusieurs storyboards car la résolution des conflits de contrôle de version dans le storyboard xml est parfois assez pénible.
Lee
14
Dans iOS 9 et Xcode 7, les références croisées de storyboard sont désormais prises en charge. :-)
Quinn Taylor
1
Voir la réponse de Milczi, vous pouvez le faire maintenant très facilement dans l'interface utilisateur!
Tim
117

À partir de Xcode 7, vous pouvez le faire graphiquement en utilisant une référence de storyboard:

référence

Ajoutez une référence de storyboard à votre storyboard. Créer une transition entre ViewController et Storyboard Reference (ctrl + glisser)

Remplissez ensuite ces champs.

entrez la description de l'image ici

Où «Tutorial» est le fichier «Tutorial.storyboard» et «MainTutorialController» est votre champ «Storyboard ID» dans ViewControllerSettings

Milczi
la source
1
Bonne information, mais la question est étiquetée ios5 donc cela ne s'applique pas.
lnafziger
10
@Inafziger oui mais cette question apparaît en haut des résultats de recherche pour les personnes utilisant iOS 9
Brian Ogden
Ceci est disponible à partir de XCode 7. Voir plus d'informations sur stackoverflow.com/questions/30772145/…
Simon Pickup
Cela a fonctionné, mais j'ai aussi besoin de conserver la barre de navigation, elle s'affiche sans la barre de navigation, y a-t-il un moyen de conserver une navigation et un bouton pour le replacer dans l'historique, peu importe de quel storyboard il provient?
Gil Beyruth
Cela fonctionne pour moi dans iOS 10. J'ai noté que j'avais besoin d'une référence de storyboard par segue et que je ne pouvais pas connecter plusieurs segues à un point de référence.
Mark Reid
10

Vous ne pouvez pas vraiment effectuer de segmentations manuellement car UIStoryboardSegue est une classe abstraite. Vous devez le sous-classer et l'implémenter performpour qu'il fasse quoi que ce soit. Ils sont vraiment destinés à être créés dans des storyboards. Vous pouvez cependant pousser le contrôleur de vue manuellement, ce qui est une bonne solution. La réponse d'lnafziger le fait bien:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

Une chose à noter, cependant, est que vous avez dit que vous vouliez garder les choses bien séparées. L'idée des storyboards est de vous permettre de garder les choses séparées tout en effectuant tout votre travail de conception en un seul endroit. Chaque contrôleur de vue est agréable et séparé dans le storyboard des autres. L'idée est de tout garder au même endroit. Disposez-le simplement de manière à ce qu'il soit organisé, et vous serez prêt à partir. Vous ne devriez pas le séparer à moins d'avoir une très bonne raison de le faire.

wbyoung
la source
6
la fusion de storyboards ne fonctionne pas très bien, donc dans un environnement multi-développeur, il pourrait être intéressant d'utiliser des storyboards séparés. De plus, les performances peuvent être assez mauvaises dans les gros projets avec un seul storyboard.
calimarkus
1
Nous utilisons plusieurs storyboards, mais le fait est que vous ne pouvez pas vraiment faire cela et faire la transition entre eux. Apple l'a conçu pour que vous puissiez tout faire au même endroit, donc l'idée est d'en utiliser un seul (pas que vous ne puissiez pas). Les performances ne devraient pas être un problème. Le storyboard est compilé dans des fichiers nib séparés pour chaque contrôleur de vue. Vous devriez obtenir de très bonnes performances avec les storyboards. Les performances seront aussi bonnes que si vous aviez des xib séparés pour chaque contrôleur de vue.
wbyoung
3
Dans mon cas, le problème de performances est généralement dans Xcode ... L'implémentation actuelle de l'éditeur de storyboard par Apple est faible.
Adam
1
Un storyboard de 60 scènes prend 13 secondes pour s'ouvrir sur un Mac Pro 2014. J'ai déposé un radar.
Robert Atkins
7

Vous ne devez pas placer UITabBarControllers dans un UINavigationController. Il demande des bogues tels qu'une autorotation incorrecte / un déchargement de vue, etc., car Apple ne prend pas en charge ce type de confinement:

Cependant, lors de la combinaison de contrôleurs de vue, l'ordre de confinement est important; seuls certains arrangements sont valables. L'ordre de confinement, de l'enfant au parent, est le suivant:

  • Contrôleurs de vue de contenu et contrôleurs de vue de conteneur qui ont des limites flexibles (comme le contrôleur de vue de page)
  • Contrôleur de vue de navigation
  • Contrôleur de la barre d'onglets
  • Contrôleur de vue fractionnée
Danra
la source
1
Je suis tout à fait d'accord, et pour de multiples raisons. Mettre un TabBarController à l'intérieur d'un NavigationController n'est pas une bonne idée, car les délégués ne se déclencheraient pas correctement pour les vues qu'ils contiennent, et l'utilisateur final aura un temps terrible à naviguer dans l'interface. Ils auraient du mal à revenir au contrôleur qui sort de l'interface TabBar / Navigation. L'inverse est OK, un NavigationController à l'intérieur d'un TabBarController. Il est toujours préférable de ne pas confondre l'utilisateur final et d'écouter les suggestions d'Apple!
Hubert Kunnemeyer
1
Et pourtant, l'application native iPhone Music fait exactement cela (partie "Lecture en cours").
Enzo Tran
FYI: l'application de musique iPhone n'a pas TabbarController dans l'écran "Lecture en cours".
sanjana
4

Voici une version rapide:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}
DudeOnRock
la source
-1

avez-vous essayé ce qui suit:

2 / cliquez pour sélectionner votre contrôleur de vue qui est lié à votre contrôleur de navigation et dans le menu du haut: éditeur -> incorporer -> contrôleur de la barre d'onglets

Remarque: je ne l'ai pas testé car j'utilise le contraire: créer des applications à barres à onglets et mettre un contrôleur de navigation à l'intérieur).

moxy
la source