Мой подход к этой проблеме заключается в использовании протокола делегата между ячейкой и табличным представлением. Это позволяет вам удерживать обработчик кнопки в подклассе ячейки, что позволяет назначить обработчик действия касания к ячейке прототипа в Interface Builder, сохраняя при этом логику обработчика кнопок в контроллере представления.
Он также избегает потенциально хрупкого подхода к навигации по иерархии представлений или использованию свойства tag
, у которого возникают проблемы при изменении индексов ячеек (в результате вставки, удаления или переупорядочения)
CellSubclass.swift
protocol CellSubclassDelegate: class {
func buttonTapped(cell: CellSubclass)
}
class CellSubclass: UITableViewCell {
@IBOutlet var someButton: UIButton!
var delegate: CellSubclassDelegate?
override func prepareForReuse() {
super.prepareForReuse()
self.delegate = nil
}
@IBAction func someButtonTapped(sender: UIButton) {
self.delegate?.buttonTapped(self)
}
ViewController.swift
class MyViewController: UIViewController, CellSubclassDelegate {
@IBOutlet var tableview: UITableView!
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CellSubclass
cell.delegate = self
// Other cell setup
}
// MARK: CellSubclassDelegate
func buttonTapped(cell: CellSubclass) {
guard let indexPath = self.tableView.indexPathForCell(cell) else {
// Note, this shouldn't happen - how did the user tap on a button that wasn't on screen?
return
}
// Do whatever you need to do with the indexPath
print("Button tapped on row \(indexPath.row)")
}
}