检测其按钮被点击的单元格

时间:2020-11-12 13:11:42

标签: ios swift uitableview uibutton segue

在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之前被调用,但不是。
为什么?还有其他解决方案可以将索引发送到secondVC吗?

1 个答案:

答案 0 :(得分:2)

<罢工> 您必须*手动*执行segue:
  • 将序列从视图控制器(而不是从表视图单元格)重新连接到目标控制器

  • 删除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]
  }
}