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:
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?
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 .
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];
En utilisant Xcode 5, il existe une solution beaucoup plus simple.
C'est tout.
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.
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);
}
Approche d’Interface Builder: il suffit de passer à une référence de storyboard qui renvoie au contrôleur de présentation.
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).
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"; }