web-dev-qa-db-fra.com

Utilisez la méthode didSelectRowAtIndexPath ou prepareForSegue pour UITableView?

J'utilise des storyboards et j'ai un UITableView. J'ai une configuration de division qui pousse de ma table au détail VC. Mais quelle méthode dois-je utiliser pour gérer cela? Je vais devoir passer quelques objets à la vue détaillée. Mais est-ce que j'utilise didSelectRowAtIndex ou -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender?

99
Jon

Si vous utilisez prepareForSegue:sender:then, vous n'aurez plus autant à changer si vous décidez ultérieurement de déclencher la transition à partir d'un contrôle situé en dehors de la vue Table.

Le message prepareForSegue:sender: est envoyé au contrôleur de vue actuel, je suggérerais donc quelque chose comme ceci:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Assume self.view is the table view
    NSIndexPath *path = [self.tableView indexPathForSelectedRow];
    DetailObject *detail = [self detailForIndexPath:path];
    [segue.destinationViewController setDetail:detail];
}

En rapide:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let path = self.tableView.indexPathForSelectedRow()!
    segue.destinationViewController.detail = self.detailForIndexPath(path)
}
195
rob mayoff

Je l'ai fait et ça a marché

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

    NSLog(@"Row Selected = %i",indexPath.row);

    [self performSegueWithIdentifier:@"testID" sender:self.view];    
}
5
Rohit Mandiwal

Lorsque l'expéditeur est UITableViewCell, vous pouvez demander à UITableView d'interroger indexPath de la cellule.

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let cell = sender as? UITableViewCell {
            let indexPath = self.tableView.indexPathForCell(cell)!
            assert(segue.destinationViewController.isKindOfClass(DetailViewController))
            let detailViewController = segue.destinationViewController as! DetailViewController
            detailViewController.item = self.items[indexPath.row] // like this
        }
    }
3
Kaz Yoshikawa

Si la cellule d'expéditeur n'est pas sélectionnable, self.tableView.indexPathForSelectedRow renvoie la cellule sélectionnée, mais ne sépare pas la cellule d'expéditeur. Le meilleur moyen est d'obtenir indexPath pour l'expéditeur de la séquence:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    ((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender];
}

En rapide:

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
    
    (segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender)
}
1
Stanislav P.

si votre propriété tableView est dans une autre classe et que vous n'avez qu'une seule section, vous pouvez utiliser la propriété tag pour stocker la ligne de la cellule comme suit:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

     cell.tag = indexPath.row;

     return cell;
}

Et vous pourrez alors y accéder car la sender est la même cellule avec la valeur de la ligne dans sa balise:

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

    MyDestinationViewController *destinationViewController = segue.destinationViewController;
    destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell 
}
1
Laszlo

Si vous utilisez prepareForSegue:, vous pouvez vérifier qui est l'expéditeur et exécuter un code différent.

Par exemple, dans Swift

override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
   var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)

   if senderIsTableviewCell
   {
       //do something
   }
}
0
Eugene