UPDATE : Obtention de l'indexPath de la cellule contenant le bouton (à la fois section et ligne):
Utilisation de la position du bouton
À l'intérieur de votre buttonTapped
méthode, vous pouvez saisir la position du bouton, la convertir en coordonnée dans la tableView, puis obtenir l'indexPath de la ligne à cette coordonnée.
func buttonTapped(_ sender:AnyObject) {
let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
}
REMARQUE : parfois, vous pouvez exécuter dans un cas de bord lorsque l'utilisation de la fonction view.convert(CGPointZero, to:self.tableView)
entraîne la recherche nil
d'une ligne à un point, même s'il existe une cellule tableView. Pour résoudre ce problème, essayez de passer une coordonnée réelle légèrement décalée par rapport à l'origine, telle que:
let buttonPosition:CGPoint = sender.convert(CGPoint.init(x: 5.0, y: 5.0), to:self.tableView)
Réponse précédente: Utilisation de la propriété de balise (ne renvoie que la ligne)
Plutôt que de grimper dans les arbres de supervision pour attraper un pointeur vers la cellule qui contient l'UIButton, il existe une technique plus sûre et plus reproductible utilisant la propriété button.tag mentionnée par Antonio ci-dessus, décrite dans cette réponse et illustrée ci-dessous:
Dans cellForRowAtIndexPath:
vous définissez la propriété de balise:
button.tag = indexPath.row
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Ensuite, dans la buttonClicked:
fonction, vous référencez cette balise pour saisir la ligne de l'indexPath où se trouve le bouton:
func buttonClicked(sender:UIButton) {
let buttonRow = sender.tag
}
Je préfère cette méthode car j'ai trouvé que se balancer dans les arbres de supervision peut être un moyen risqué de concevoir une application. Aussi, pour l'objectif-C, j'ai utilisé cette technique dans le passé et j'ai été satisfait du résultat.