Как определить щелчок по нескольким кнопкам в UITableViewCell из UITableView - Swift 4 - PullRequest
0 голосов
/ 08 марта 2019

Я хочу реализовать UITableView, где я хочу иметь 3 кнопки в каждой UITableViewCell.Я хочу выполнить разные действия для каждой кнопки.Как определить, какая кнопка нажата, а затем получить объект (индексную строку) выбранной ячейки?

UIViewController

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let show=shows[indexPath.row]
    let cell = tableView.dequeueReusableCell(withIdentifier: "ShowCell") as!
    ShowCell

    cell.setShow(show: show)
    return cell
}

UITableViewCell

@IBOutlet weak var graphButton: FlatButton!
@IBOutlet weak var buyButton: FlatButton!
@IBOutlet weak var reviewButton: FlatButton!


func setShow(show :StubHubEvent ){


    let url = URL(string: show.imageurl)!

    showImageView.af_setImage(withURL: url)
    showImageView.contentMode = .scaleAspectFill
    showImageView.clipsToBounds = true
    nameLabel.text = show.title
    dateLabel.text = show.time

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

реализуйте действие вашей кнопки в UIviewcontroller, а не в UITableViewCell, создайте цель внутри cellforRow, а также добавьте тег для каждой цели, чтобы определить, какая кнопка была нажата пользователем. Например,

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let show=shows[indexPath.row]
    let cell = tableView.dequeueReusableCell(withIdentifier: "ShowCell") as!
    ShowCell

     cell.graphButton.tag = indexPath.row
     cell.buyButton.tag = indexPath.row
     cell.reviewButton.tag = indexPath.row

     cell.graphButton?.addTarget(self, action: #selector(self.graphButtonClicked(_:)), for: .touchUpInside)
     cell.buyButton?.addTarget(self, action: #selector(self.buyButtonClicked(_:)), for: .touchUpInside)          
     cell.reviewButton?.addTarget(self, action: #selector(self.reviewButtonClicked(_:)), for: .touchUpInside)


    cell.setShow(show: show)
    return cell
}

и обработатьдействие как

 @objc func buyButton( _ sender: UIButton) {
       print("buyButton Action Found the index of \(sender.tag)")

}

@objc func graphButtonClicked( _ sender: UIButton) {
       print("graphButtonClicked Action Found the index of \(sender.tag)")

}

@objc func reviewButtonClicked( _ sender: UIButton) {
       print("reviewButtonClicked Action Found the index of \(sender.tag)")

}

Опция 2

, если вы хотите выполнить в своей кнопке действие в классе UItableviewcell с использованием шаблона делегата, то обратитесь к этому дубликату ответ

0 голосов
/ 08 марта 2019

Есть два способа получить выполнение нажатия кнопки в ViewController из TableViewCell

  1. Использовать шаблон делегата
  2. Использовать блоки в качестве обратных вызовов и обрабатывать выполнение блоков в методе cellForRow
  3. Добавить addTarget (:), чтобы добавить целевой метод для нажатия кнопки

Подробности:

  1. Первый подход лучше всего среди всехтри упомянутых подхода, в этом, вам нужно создать делегат, который перенаправляет ваши пользовательские действия от ячейки к контроллеру представления.Проверьте приведенный ниже пример кода.
  2. Второй подход аналогичен первому, он просто перенаправляет вызовы тех же методов, используя блоки вместо методов и протокола Delegate.
  3. Третий подход не годитсяпоскольку оно тесно связано со значением indexPath.row, в индустрии разработки программного обеспечения

сцепление должно быть высоким, сцепление должно быть низким.

Код первого подхода:

//MARK:- Model - StubHubEvent
class StubHubEvent {
  //you model class implementation
}

//MARK:- Protocol - ShowCellUIInteractionDelegate - used to redirect user actions from cell to viewController
protocol ShowCellUIInteractionDelegate: AnyObject {
  func showCell(cell: ShowCell, didTapBuyFor show: StubHubEvent)
  func showCell(cell: ShowCell, didTapGraphFor show: StubHubEvent)
  func showCell(cell: ShowCell, didTapReviewFor show: StubHubEvent)
}

//MARK:- Cell-  ShowCell
class ShowCell: UITableViewCell {

  var show: StubHubEvent!
  weak var delegateUIInteraction: ShowCellUIInteractionDelegate?


  func setShow(show :StubHubEvent ){
    self.show = show
    //your other setup
  }

  //Bind these three action from cell to buttons as a .touchUpInside event
  @IBAction func buttonBuyDidTap( _ sender: UIButton) {
    self.delegateUIInteraction?.showCell(cell: self, didTapBuyFor: self.show)
  }

  @IBAction func buttonGraphDidTap( _ sender: UIButton) {
    self.delegateUIInteraction?.showCell(cell: self, didTapGraphFor: self.show)
  }

  @IBAction func buttonReviewDidTap( _ sender: UIButton) {
    self.delegateUIInteraction?.showCell(cell: self, didTapReviewFor: self.show)
  }
}

//MARK:- ViewController - ShowListingViewController
class ShowListingViewController: UIViewController {
  //you ShowListingViewController implementation
}
//MARK:- Extension - ShowCellUIInteractionDelegate
extension ShowListingViewController: ShowCellUIInteractionDelegate {
  //execute your logic for the show model object
  func showCell(cell: ShowCell, didTapBuyFor show: StubHubEvent){

  }
  func showCell(cell: ShowCell, didTapGraphFor show: StubHubEvent){

  }
  func showCell(cell: ShowCell, didTapReviewFor show: StubHubEvent){

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...