J'ai trop de points de vue sur un scénario, ce qui le ralentit vraiment. On m'a dit qu'une solution à ce problème serait de scinder le storyboard en plusieurs storyboards. Quelqu'un pourrait-il me dire comment passer d'une vue du storyboard 1 à une vue du storyboard 2 via un bouton?
J'ai essayé tout ce que j'avais lu mais sans succès. J'ai réussi à le faire fonctionner avec Rob Browns Storyboard Link Il est facile à mettre en œuvre et fonctionne très rapidement
Dans Swift (iOS 8.1), c'est assez facile :
var storyboard: UIStoryboard = UIStoryboard(name: "Another", bundle: nil)
var vc = storyboard.instantiateViewControllerWithIdentifier("NextViewController") as AnotherViewController
self.showViewController(vc, sender: self)
Mise à jour pour Swift 3:
let storyboard: UIStoryboard = UIStoryboard(name: "Another", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "NextViewController") as! AnotherViewController
self.show(vc, sender: self)
Une autre solution utilisant segues (iOS SDK 6.0+), qui maintient le code séparé par objectif et laisse une marge de personnalisation:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
//check/validate/abort segue
return YES;
}//optional
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//sender - segue/destination related preparations/data transfer
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController *destination = [[UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil] instantiateInitialViewController];
UIStoryboardSegue *segue = [UIStoryboardSegue segueWithIdentifier:@"identifier" source:self destination:destination performHandler:^(void) {
//view transition/animation
[self.navigationController pushViewController:destination animated:YES];
}];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self shouldPerformSegueWithIdentifier:segue.identifier sender:cell];//optional
[self prepareForSegue:segue sender:cell];
[segue perform];
}
Remarque: UITableViewCell *cell
est utilisé comme sender
pour conserver le comportement de réponse default TableViewController
.
Enfin, XCode 7 a ajouté cette fonctionnalité dans laquelle vous pouvez séparer les contrôleurs de vue de deux story-boards différents à l'aide du générateur d'interface. Jusqu'à présent, nous devions le faire par programme.
Tout d’abord, diviser un scénario en plusieurs scénarios distincts est une excellente idée, ce qui évite beaucoup de maux de tête (surtout si vous faites partie d’une équipe et que vous devez gérer de nombreux conflits de fusion dans le fichier de scénario).
Maintenant, pour répondre à votre question, vous ne pouvez pas forcément séparer deux scénarimages, mais une solution avec laquelle j'ai eu beaucoup de succès est de faire quelque chose comme ceci:
- (IBAction)buttonPressed:(id)sender {
UIViewController *otherVC = [[UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil] instantiateInitialViewController]; //Or get a VC by its identifier
[self.navigationController pushViewController:otherVC animated:YES];
}
Il vous suffit de charger l’autre scénario et d’appeler instantiateInitialViewController
ou instantiateViewControllerWithIdentifier:
, puis de réaliser la transition souhaitée.
J'espère que cela t'aides.
Voici une solution simple Swift:
let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
// .instantiatViewControllerWithIdentifier() returns AnyObject! this must be downcast to utilize it
self.presentViewController(viewController, animated: false, completion: nil)
Swift 3
let vc = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerIdentifier") as? ExpectedViewControllerClass
self.show(vc, sender: self)
Où "StroboardName" est le nom de votre .storyboardfile . "ViewControllerIdentifier" est l'identifiant de la vue dans le story board Et "self" est un UIViewController
Dans mon cas, l'identifiant était "ChooseCountryViewController"