Кнопка обнаружения проблемы cellForRowAt

Мне нужно определить, была ли нажата кнопка в UITableViewController

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let LikesBtn = cell.viewWithTag(7) as! UIButton } 

Самый простой и эффективный способ в Swift – это закрытие обратного вызова.

  • Подclass UITableViewCell , метод viewWithTag для идентификации элементов пользовательского интерфейса устарел.
  • Задайте class настраиваемой ячейки для имени подclassа и установите идентификатор ButtonCellIdentifier в Interface Builder.

  • Добавить свойство callback .

  • Добавьте действие и подключите кнопку к действию.

     class ButtonCell: UITableViewCell { var callback : (()->())? @IBAction func buttonPressed(_ sender : UIButton) { callback?() } } 
  • В cellForRow назначьте обратный вызов настраиваемой ячейке.

     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonCellIdentifier", for: indexPath) as! ButtonCell cell.callback = { print("Button pressed", indexPath) } return cell } 
  • Когда кнопка нажата, вызывается обратный вызов. Путь указателя захватывается.

Вот что я использую:

Сначала инициализируйте кнопку как Outlet и ее action на TableViewCell

 class MainViewCell: UITableViewCell { @IBOutlet weak var testButton: UIButton! @IBAction func testBClicked(_ sender: UIButton) { let tag = sender.tag //with this you can get which button was clicked } } 

Затем в вас главный controller в функции cellForRow просто инициализирует тег кнопки следующим образом:

 class MainController: UIViewController, UITableViewDelegate, UITableViewDataSource, { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! MainViewCell cell.testButton.tag = indexPath.row return cell } } 

Первый шаг: создайте подclass для вашего пользовательского UITableViewCell, также зарегистрируйте протокол.

Что-то вроде этого:

 protocol MyTableViewCellDelegate: class { func onButtonPressed(_ sender: UIButton, indexPath: IndexPath) } class MyTableViewCell: UITableViewCell { @IBOutlet var cellButton: UIButton! var cellIndexPath: IndexPath! var delegate: MyTableViewCellDelegate! override func awakeFromNib() { super.awakeFromNib() cellButton.addTarget(self, action: #selector(self.onButton(_:)), for: .touchUpInside) } func onButton(_ sender: UIButton) { delegate.onButtonPressed(sender, indexPath: cellIndexPath) } } 

В своем TableViewController убедитесь, что он соответствует только что созданному протоколу MyTableViewCellDelegate.

Посмотрите на код ниже для лучшего понимания.

 class MyTableViewController: UITableViewController, MyTableViewCellDelegate { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as? MyTableViewCell { cell.cellIndexPath = indexPath cell.delegate = self return cell } else { print("Something wrong. Check your cell idetifier or cell subclass") return UITableViewCell() } } func onButtonPressed(_ sender: UIButton, indexPath: IndexPath) { print("DID PRESSED BUTTON WITH TAG = \(sender.tag) AT INDEX PATH = \(indexPath)") } } 
  • Как предоставить пространство между двумя ячейками в виде таблицы?
  • UITableview с более чем одной пользовательской ячейкой с Swift
  • Переключить флажок в UITableViewCell
  • Как настроить разделитель таблицы в iPhone
  • Использование iPhone - dequeueReusableCellWithIdentifier
  • Калибровка UITableViewCell для включения и выключения при использовании
  • Можете ли вы настраивать анимацию для встраиваемых ячеек UITableView?
  • Прокрутка UITableView внутри UIScrollView
  • Как динамически изменять размер UITableViewCell
  • Как обнаружить одну кнопку в ячейке таблицы
  • iOS 7 - Как отобразить выбор даты в виде таблицы?
  • Давайте будем гением компьютера.