Ваш метод actionButton
создает новый экземпляр TableViewController
каждый раз, когда он вызывается. Это не относится к TableViewController
, который (предположительно) представляет клетки.
Вы можете справиться с этим несколькими способами. Протокол delegate
- это «классический» способ сделать это, или вы можете использовать закрытие Swift.
Метод делегата
В твоей камере
protocol TableViewCellDelegate: class {
func tableViewCellDidTapButton(_ tableViewCell: TableViewCell)
}
class TableViewCell: UITableViewCell {
var weak delegate: TableViewCellDelegate?
@IBAction func actionButton(_ sender: UIButton) {
delegate?.tableViewCellDidTapButton(self)
}
}
На ваш взгляд контроллер
class TableViewController: UITableViewController {
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
cell.delegate = self
return cell
}
}
extension class TableViewController: TableViewCellDelegate {
func tableViewCellDidTapButton(_ tableViewCell: TableViewCell) {
let indexPath = indexPath(for: tableViewCell)
// do something
}
}
Метод закрытия
В твоей камере
class TableViewCell: UITableViewCell {
var didTapButton: Void -> () = { }
@IBAction func actionButton(_ sender: UIButton) {
didTapButton()
}
}
На ваш взгляд контроллер
class TableViewController: UITableViewController {
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
cell.didTapButton = {
// do something with this indexPath
}
return cell
}
}