web-dev-qa-db-fra.com

Passer d'un scénario à un autre?

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? 

25
BrownEye

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

6
BrownEye

Avec Xcode 7, vous pouvez choisir les références Storyboard.

 enter image description here

et définir le storyboard et le contrôleur de destination

 enter image description here

30
Nycen

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)
23
metamorph2
20

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.

9
Nocross

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.

5
Udit Agarwal

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.

3
Dan Fairaizl

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)
2
Mingebag

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"

0
al_mota