检测按钮被点击的单元格

Detecting cell whose button was tapped

在 FirstVC 上我有一个变量索引:

var index = -1

,它保留了单元格 indexPath.row 的信息,因此我可以知道在哪个单元格中点击了按钮。 (每个单元格都有自己的按钮)

我这样试过:
CellForRow:

cell.Btn.tag = indexPath.row
cell.Btn.addTarget(self, action: #selector(detectButton), for: .touchUpInside)

然后:

@objc func detectButton(sender: UIButton) {
    self.index = sender.tag
}

secondVC 由 segue 连接,所以我尝试这样发送索引:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MySegue" {
            let vc = segue.destination as! SecondVC
            vc.element = self.elements[index]
        }
    }

它在那里崩溃,因为索引仍然是 -1。我认为 @objc func detectButton 将在 prepareForSegue 之前被调用,但事实并非如此。
为什么?还有其他解决方案可以将索引发送到第二个VC吗?

您必须*手动*执行 segue:
  • 将 segue 从 视图控制器(而不是从 table 视图单元)重新连接到目标控制器

  • 删除var index = -1

  • 替换

    @objc func detectButton(sender: UIButton) {
        self.index = sender.tag
    }
    

    with(注意左括号后的下划线)

    @objc func detectButton(_ sender: UIButton) {
        performSegue(withIdentifier: "MySegue", sender: sender.tag)
    }
    
  • 替换

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "MySegue" {
            let vc = segue.destination as! SecondVC
            vc.element = self.elements[index]
        }
    }
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "MySegue" {
            let vc = segue.destination as! SecondVC
            let index = sender as! Int
            vc.element = self.elements[index]
        }
    }
    

编辑:

显然在当前的 segue 设置中,按钮触发了 segue。如果是这样删除 var index = -1 和行 cell.Btn.addTarget... (但 不是 分配标签的行)和整个方法 @objc func detectButton(_ sender: UIButton) { ... }.

prepare(for segue中从sender参数中获取标签

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if segue.identifier == "MySegue" {
      let vc = segue.destination as! SecondVC
      let index = (sender as! UIButton).tag
      vc.element = self.elements[index]
  }
}