Si vous utilisez, prepareForSegue:sender:
vous n'aurez pas autant à changer si vous décidez plus tard de déclencher la transition à partir d'un contrôle en dehors de la vue de table.
Le prepareForSegue:sender:
message est envoyé au contrôleur de vue actuel, je suggère 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];
}
Dans Swift:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let path = self.tableView.indexPathForSelectedRow()!
segue.destinationViewController.detail = self.detailForIndexPath(path)
}
self.view
être justesender
ici? Je ne pouvais même pas me rendre[self.view indexPathForSelectedRow]
au travail, je devais le faire[sender indexPathForSelectedRow];
tableView.indexPathForSelectedRow()
contenir la valeur correcte lors de l'prepareFroSegue...
appel:tableView(_:didSelectrowAtIndexPath:)
n'est appelé que plus tard.Je l'ai fait et ça a marché
la source
Lorsque l'expéditeur est UITableViewCell, vous pouvez demander à UITableView d'interroger l'indexPath de la cellule.
la source
si votre propriété tableView est dans une autre classe et que vous n'avez qu'une seule section , vous pouvez utiliser la
tag
propriété pour stocker la ligne de la cellule comme:Et puis vous pouvez y accéder car
sender
c'est la même cellule avec la valeur de ligne dans sa balise:la source
self.tableView.indexPathForSelectedRow
renvoie la cellule sélectionnée, mais pas la cellule de l'expéditeur, par exemple la cellule de l'expéditeur n'est pas sélectionnée (action accessoire), ou en cas de sélection multiple. Le meilleur moyen est d'obtenir indexPath pour l'expéditeur de segue:Dans Swift:
la source
Si vous utilisez,
prepareForSegue:
vous pouvez vérifier qui est l'expéditeur et exécuter un code différentPar exemple dans swift
la source