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 buttonTappedmé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 nilpara 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.