如何从UITableView识别UITableViewCell中多个按钮的单击-Swift 4

时间:2019-03-08 03:40:15

标签: ios swift uitableview uibutton

我想实现UITableView,我希望每个UITableViewCell中有3个按钮。我想对每个按钮执行不同的操作。如何识别按下哪个按钮,然后获取所选单元格的对象(索引行)?

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 个答案:

答案 0 :(得分:2)

在UIviewcontroller而不是UITableViewCell中实现按钮动作,在cellforRow内部创建目标,并为每个目标添加Tag以标识用户按下了哪个按钮。例如

  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类的按钮操作中执行,请参考此duplicate answer

答案 1 :(得分:0)

有两种方法可以从TableViewCell中获取ViewController中的按钮单击执行

  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){

  }
}