UPDATE : Pobieranie indexPath komórki zawierającej przycisk (zarówno sekcja, jak i wiersz):
Korzystanie z pozycji przycisku
Wewnątrz buttonTapped
metody możesz pobrać położenie przycisku, przekonwertować go na współrzędną w tableView, a następnie pobrać indexPath wiersza o tej współrzędnej.
func buttonTapped(_ sender:AnyObject) {
let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
}
UWAGA : Czasami możesz napotkać przypadek krawędzi, gdy użycie funkcji view.convert(CGPointZero, to:self.tableView)
powoduje znalezienie nil
wiersza w punkcie, nawet jeśli znajduje się tam komórka tableView. Aby to naprawić, spróbuj podać rzeczywistą współrzędną, która jest nieco odsunięta od początku, na przykład:
let buttonPosition:CGPoint = sender.convert(CGPoint.init(x: 5.0, y: 5.0), to:self.tableView)
Poprzednia odpowiedź: Używanie właściwości tagu (zwraca tylko wiersz)
Zamiast wspinać się po drzewach Superview, aby złapać wskaźnik do komórki, w której znajduje się przycisk UIButton, istnieje bezpieczniejsza, bardziej powtarzalna technika wykorzystująca właściwość button.tag wspomnianą przez Antonio powyżej, opisaną w tej odpowiedzi i pokazaną poniżej:
W cellForRowAtIndexPath:
ustawiasz właściwość tagu:
button.tag = indexPath.row
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Następnie w buttonClicked:
funkcji odwołujesz się do tego tagu, aby pobrać wiersz indexPath, w którym znajduje się przycisk:
func buttonClicked(sender:UIButton) {
let buttonRow = sender.tag
}
Wolę tę metodę, ponieważ odkryłem, że kołysanie się w drzewach nadzoru może być ryzykownym sposobem projektowania aplikacji. Ponadto w przypadku obiektywu C używałem tej techniki w przeszłości i byłem zadowolony z wyniku.