49 votes

StoryBoard IOS - Segmentation multiple à partir d'une TableCell

Bonjour, j'ai un storyboard et je suis capable d'afficher une vue détaillée en cliquant sur une cellule du tableau. Je veux ajouter une fonctionnalité supplémentaire pour que, selon la cellule sur laquelle je clique, j'affiche un contrôleur de vue différent. J'ai essayé de faire glisser deux séquences à partir de la même cellule, mais cela ne fonctionne pas.

Je pensais avoir deux séquences de la cellule, chacune pointant vers une vue différente, puis invoquer la séquence souhaitée :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSInteger row = indexPath.row;
    NSLog(@"Selected Item :-) %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:row]]);
    if(row %2 ==0){
        NSLog(@"Even");        
        [self performSegueWithIdentifier:@"ShowSecondIndex" sender:self];
    }else{
        [self performSegueWithIdentifier:@"ShowSelectedMovie" sender:self];
        NSLog(@"Odd");

    }

} 

Je traiterais alors la séquence dans prepareForSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    NSLog(@"Prepare For Segue ID:%@",[segue identifier]);

    if([[segue identifier] isEqualToString:@"ShowSelectedMovie"]){
        Tab2_ItemViewController *vc = [segue destinationViewController];
        NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
        NSLog(@"Selected Index: %d",selectedIndex);
        [vc setSelectedItem: [NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]];
        NSLog(@"String Value: %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]);
        [vc setSelectedIndex:selectedIndex];

    }else if([[segue identifier] isEqualToString:@"ShowSecondIndex"]){

        NSLog(@"Viewing Second Index");
    }

}

Cependant, il ne montre jamais la deuxième vue. Est-ce parce qu'il n'est pas possible d'avoir deux séquences à partir d'une seule cellule de tableau ? J'ai également essayé de faire glisser les deux segments du contrôleur vers chaque destination plutôt qu'un à partir de la cellule et l'autre à partir du contrôleur, mais sans succès ?

2 votes

@casperOne - Pourquoi avez-vous fermé ce dossier ? Si vous ne comprenez pas la question, ignorez-la. Il s'agit d'une question TRÈS courante pour les personnes qui essaient d'utiliser Storyboards. Veuillez la déconnecter.

1 votes

Tout à fait d'accord. Elle a sûrement été fermée par accident ? S'il vous plaît, ouvrez-la.

0 votes

Idem. Cela a probablement été fermé par erreur.

68voto

LJ Wilson Points 10777

Dans ce cas, n'essayez pas de relier les segments à une cellule de table. Accrochez-les au contrôleur de vue lui-même.

1 votes

J'ai essayé ceci mais toujours pas de chance, seulement une des vues était appelée

12 votes

Il faut que ça marche. Je fais ça tout le temps. Supprimez les segments que vous avez actuellement sur ce VC et ajoutez-les en vous assurant de connecter chaque segment au VC lui-même. Vous pouvez ensuite appeler [self performSegueWithIdentifier:@"segueID" sender:nil] ; sur le didSelectRowAtIndexPath.

4 votes

Super ! Je ne savais pas que l'on pouvait avoir des segues à partir du contrôleur de vue, je pensais qu'elles ne pouvaient aller que depuis un bouton ou autre :) J'aime un peu plus les enchaînements maintenant.

47voto

mgrandi Points 2755

N'essayez pas de créer des séquences multiples à partir d'un TableCell vers d'autres contrôleurs de vue, vous devez faire ctrl+drag à partir de l'icône du contrôleur de vue sous le contrôleur de vue dans l'interface du storyboard vers les contrôleurs de vue vers lesquels vous voulez faire une séquence. Vous pourrez alors configurer plusieurs séquences.

screenshot showing multiple segues

et ensuite, pour faire fonctionner les segments, vous devez ajouter des identifiants aux segments eux-mêmes, ce que vous pouvez faire en cliquant sur eux et en leur donnant un nom dans l'inspecteur des propriétés :

giving segue an identifier

puis, pour l'exemple des TableCells, dans votre UITableViewDelegate, en

-tableView:didSelectRowAtIndexPath: 

vous pouvez utiliser

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

pour démarrer manuellement une séquence en fonction de votre propre logique quant à la séquence à choisir.

0 votes

C'est la meilleure réponse car Interface Builder avec les Storyboards n'est pas super intuitif. Savoir où vous contrôlez le clic de est la clé :)

0 votes

Merci d'avoir décrit exactement comment faire cela dans l'IB !

4voto

aztack Points 1095

Voici un exemple de code tiré de mon projet de démonstration :

-         (void)tableView:(UITableView *)tableView
  didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *segueName = nil;

    if (type == kCore) {
        segueName = @"segue1";
    } else if (type == kStdlib) {
        segueName = @"segue2";
    }

    [self performSegueWithIdentifier: segueName sender: self];
}

type est une propriété du contrôleur de la vue, qui détermine quelle séquence doit être exécutée.

Comme le dit la réponse ci-dessus, la clé est de créer une segue en reliant deux contrôleurs de vue.

1voto

AidenX Points 159

Dans le martinet 3.1, avec un contrôle de segment de deux états

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var segue: String!
if selectedSegment == 0 {
    segue = "segue1"
} else  {
    segue = "segue2"
}
self.performSegue(withIdentifier: segue, 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