web-dev-qa-db-fra.com

Passer à un autre storyboard?

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

131
Ry-

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];
200
lnafziger

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

reference

Ajoutez une référence au storyboard à votre storyboard. Créer une transition entre ViewController et la référence du storyboard (ctrl + glisser)

Puis remplissez ces champs.

enter image description here

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

115
milczi

Vous ne pouvez pas vraiment faire de séquences manuellement car UIStoryboardSegue est une classe abstraite. Vous devez le sous-classer et implémenter perform pour qu'il puisse faire 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'Inafziger 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 voulez garder les choses bien et 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 au même endroit. Chaque contrôleur de vue est agréable et séparé du storyboard des autres. L'idée est de tout garder au même endroit. Disposez-le simplement pour 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.

10
wbyoung

Vous ne devez pas placer UITabBarControllers dans un UINavigationController. Il demande des bugs tels que des erreurs d'autorotation/de déchargement de vues, etc., comme Apple ne supporte pas) 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 ayant des limites flexibles (telles que le contrôleur de vue de page)
  • Contrôleur de vue de navigation
  • Contrôleur de barre d'onglets
  • Contrôleur de vue fractionnée
7
Danra

Voici une version Swift:

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