77 votes

Storyboard Segue De View Controller à lui-même

Je suis en train de faire un mécanisme de creuser un fichier / dossier dans la liste. L'idée est de montrer le même fichier liste-vue-contrôleur à chaque fois que l'utilisateur sélectionne un dossier et afficher un fichier détail-vue-contrôleur si il/elle sélectionne un fichier.

Pour l'instant j'ai créé une séquence à partir de la liste de fichiers affichage de contrôleur pour le fichier détail-vue-contrôleur, et une séquence à partir de la liste de fichiers affichage de tableau de cellules de la de la liste de fichiers affichage de tableau de contrôleur:

Storyboard

Le problème, c'est que dès que l'utilisateur appuie sur la cellule, la séquence est exécutée. Je voudrais enlever la séquence à partir de la vue de la table de la cellule et de faire un à partir de la liste de fichiers affichage de contrôleur à lui-même. De cette façon, je pouvais déclencher le droit segue par programme lorsque l'utilisateur a tapé la cellule.

Donc, ma question est: Est est possible de créer une séquence à partir d'une vue contrôleur à lui-même dans Interface Builder?

43voto

Jim True Points 560

Si vous utilisez un contrôleur de navigation, vous devez placer le ViewController dans la pile de navigation. Dans cet exemple, j'ai nommé ViewController "VDI" dans les paramètres de mon ID Storyboard.

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];
 

Si vous ne souhaitez pas que NavigationController continue de s’ajouter lui-même à votre historique "Précédent", vous pouvez extraire la pile avant de l’ajouter comme cela.

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];
 

31voto

John Henckel Points 554

En utilisant Xcode 5, il existe une solution beaucoup plus simple.

  1. Cliquez sur la cellule du tableau dans le storyboard
  2. Ouvrez l'inspecteur de connexions (icône de la flèche droite en haut à droite).
  3. Sous "séquences déclenchées", vous voyez "sélection"
  4. Faites glisser le cercle à côté de "sélection" vers la cellule du storyboard

C'est ça.

26voto

T.J. Points 2711

J'ai développé une méthode pour créer une séquence à l'aide d'un bouton fantôme. Je crois que cela résoudra votre problème. Vous pouvez lire à ce sujet dans ma réponse ici .

24voto

Mustafa Points 667

Au lieu d'effectuer une transition vers le même contrôleur, vous pouvez instancier un contrôleur de vue (le même) à partir du storyboard, puis l'envoyer au contrôleur de navigation.

12voto

Chris Points 310

Dans IOS 6, il existe une solution plus propre que l’utilisation d’un bouton fantôme. Vous pouvez toujours définir la séquence de la cellule de table au contrôleur de vue et consulter l'expéditeur pour annuler la séquence déclenchée automatiquement:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X