ATUALIZAÇÃO : Obtendo o indexPath da célula que contém o botão (seção e linha):
Usando a posição do botão
Dentro do seu buttonTapped
método, você pode pegar a posição do botão, convertê-lo em uma coordenada em tableView e, em seguida, obter o indexPath da linha nessa coordenada.
func buttonTapped(_ sender:AnyObject) {
let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
}
NOTA : Às vezes, você pode chegar a um caso extremo ao usar os view.convert(CGPointZero, to:self.tableView)
resultados da função nil
para encontrar uma linha em um ponto, mesmo que haja uma célula tableView lá. Para corrigir isso, tente passar uma coordenada real ligeiramente deslocada da origem, como:
let buttonPosition:CGPoint = sender.convert(CGPoint.init(x: 5.0, y: 5.0), to:self.tableView)
Resposta anterior: Usando a propriedade da tag (retorna apenas linha)
Em vez de subir nas árvores de supervisualização para pegar um ponteiro para a célula que contém o UIButton, há uma técnica mais segura e mais repetível que utiliza a propriedade button.tag mencionada por Antonio acima, descrita nesta resposta e mostrada abaixo:
No cellForRowAtIndexPath:
você define a propriedade da tag:
button.tag = indexPath.row
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Então, no buttonClicked:
função, você faz referência a essa tag para capturar a linha do indexPath onde o botão está localizado:
func buttonClicked(sender:UIButton) {
let buttonRow = sender.tag
}
Eu prefiro esse método, pois descobri que balançar nas árvores do superview pode ser uma maneira arriscada de projetar um aplicativo. Além disso, para o objetivo-C, usei essa técnica no passado e estou feliz com o resultado.