web-dev-qa-db-fra.com

Storyboard Segue De View Contrôleur à lui-même

J'essaie de créer un mécanisme pour explorer une liste de fichiers/dossiers. L’idée est d’afficher le même contrôleur de vue de liste de fichiers chaque fois que l’utilisateur sélectionne un dossier et d’afficher un contrôleur de vue de détail du fichier s’il sélectionne un fichier.

Jusqu'ici, j'ai créé un segment du contrôleur de vue de liste de fichiers au contrôleur de vue de détail de fichiers, et un segment de la cellule de vue de table de liste de fichiers au contrôleur de vue de liste de fichiers:

 enter image description here

Le problème avec ceci est que dès que l'utilisateur appuie sur la cellule, la transition est exécutée. Je souhaite supprimer le segment de la cellule de la vue tableau et en créer un à partir du contrôleur de la vue liste des fichiers. De cette façon, je pourrais déclencher la bonne séquence par programmation lorsque l'utilisateur tapait sur la cellule.

Ma question est donc la suivante: est-il possible de créer une transition entre un contrôleur de vue et lui-même dans Interface Builder?

72
Jorge

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

26
T.J.

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 voulez 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];
42
Jim True

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 tout. 

28
John Henckel

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 scénario, puis l'envoyer au contrôleur de navigation.

23
Mustafa

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);
}
13
Chris

Approche d’Interface Builder: il suffit de passer à une référence de storyboard qui renvoie au contrôleur de présentation.

11
Joshua C. Lerner

La bonne solution consiste à utiliser une référence de storyboard qui référence le contrôleur UIViewController que vous souhaitez classer pour lui-même, puis pointez le sélecteur vers elle.

 enter image description here

9
Sethmr

Voici comment vous pouvez envoyer une autre instance du contrôleur de vue actuel sans définir de séquence ni coder en dur son propre identifiant:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

Vous devez simplement définir l'ID de restauration pour qu'il soit identique à l'ID de Storyboard (une case à cocher est disponible dans IB).

 Restoration ID

4
Tomas Andrle

J'espère que cela t'aides.

J'ai trouvé que vous pouvez créer plusieurs cellules prototypes.

Ensuite, vous pouvez relier chaque cellule (du scénarimage) à une vue différente.

Quelque chose comme ça:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
0
Yari