web-dev-qa-db-fra.com

IOS StoryBoard plusieurs séquences d'une cellule de tableau

Bonjour, j'ai un storyboard et je peux afficher une vue détaillée en cliquant sur une cellule du tableau. Je veux ajouter des fonctionnalités supplémentaires afin qu'en fonction de la cellule sur laquelle je clique, j'affiche un contrôleur de vue différent. J'ai essayé de faire glisser deux séquences de la même cellule mais cela ne le permet pas.

Je pensais que j'aurais deux séquences de la cellule pointant chacune vers une vue différente, puis j'invoquerais 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 gérerais ensuite 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 séquences du contrôleur vers chaque destination plutôt qu'une depuis la cellule et une depuis le contrôleur, mais pas de chance ???

47
Bear

N'essayez pas de brancher les Segues à une tableviewview dans ce cas. Connectez-les au View Controller lui-même.

66
LJ Wilson

N'essayez pas de créer plusieurs séquences à partir d'une TableCell vers d'autres contrôleurs de vue, vous souhaitez ctrl + faire glisser 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 auxquels vous souhaitez vous connecter. Ensuite, il vous permettra de configurer plusieurs séquences.

screenshot showing multiple segues

puis pour que les séquences fonctionnent, vous devez ajouter des identificateurs aux séquences elles-mêmes, ce que vous pouvez faire en cliquant dessus et en lui donnant un nom dans l'inspecteur des propriétés:

giving segue an identifier

puis, pour l'exemple de TableCells, dans votre UITableViewDelegate, dans

-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 de la séquence à choisir.

46
mgrandi

Voici un exemple de code 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é de view controller, qui détermine quelle séquence doit être effectuée.

Comme l'a dit la réponse ci-dessus, la clé est de créer une séquence en reliant deux contrôleurs de vue.

4
aztack

In Swift 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)

}

1
AidenX