ОБНОВЛЕНИЕ : получение indexPath ячейки, содержащей кнопку (как раздел, так и строку):
Использование положения кнопки
Внутри вашего buttonTapped
метода вы можете захватить позицию кнопки, преобразовать ее в координату в tableView, а затем получить indexPath строки по этой координате.
func buttonTapped(_ sender:AnyObject) {
let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to:self.tableView)
let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
}
ПРИМЕЧАНИЕ . Иногда вы можете столкнуться с крайним случаем, когда использование функции view.convert(CGPointZero, to:self.tableView)
приводит к поиску nil
строки в точке, даже если там есть ячейка tableView. Чтобы исправить это, попробуйте передать реальную координату, которая немного смещена от начала координат, например:
let buttonPosition:CGPoint = sender.convert(CGPoint.init(x: 5.0, y: 5.0), to:self.tableView)
Предыдущий ответ: Использование свойства тега (возвращает только строку)
Вместо того, чтобы лазить по деревьям супервизора, чтобы захватить указатель на ячейку, которая содержит UIButton, существует более безопасный и повторяемый метод, использующий свойство button.tag, упомянутое Антонио выше, описанное в этом ответе и показанное ниже:
В cellForRowAtIndexPath:
установке свойства тега:
button.tag = indexPath.row
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Затем в buttonClicked:
функции вы ссылаетесь на этот тег, чтобы получить строку indexPath, в которой расположена кнопка:
func buttonClicked(sender:UIButton) {
let buttonRow = sender.tag
}
Я предпочитаю этот метод, так как обнаружил, что раскачивание в деревьях супервизора может быть рискованным способом разработки приложения. Кроме того, для объективного C я использовал эту технику в прошлом и был доволен результатом.