【问题标题】:Detecting cell whose button was tapped检测按钮被点击的单元格
【发布时间】:2021-02-24 11:54:14
【问题描述】:

在 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
}

第二个VC是通过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 吗?

【问题讨论】:

  • 是什么导致prepareForSegue 被调用?
  • 第一次使用 segues,因为我不得不这样做。 Segue 是通过单元格中的按钮在情节提要中定义的。

标签: ios swift uitableview uibutton segue


【解决方案1】:
您必须*手动*执行 segue:
  • 将 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]
  }
} 

【讨论】:

  • let index = sender as! Int 在那一行我有一个信号 SIGABRT 崩溃说:无法将类型“UIButton”(0x1e64d07d8)的值转换为“NSNumber”(0x1e648a658)。
  • 如果按钮通过,写(sender as! UIButton).tag
  • 好的,已更改但仍有崩溃提示 Could not cast value of type '__NSCFNumber' (0x1e647e978) to 'UIButton' (0x1e64d07d8).
  • 等一下,您不能同时拥有 both 错误消息。我的意思是只用let index = (sender as! UIButton).tag替换let index = sender as! Int
  • 谢谢,但我已经更换了。我没有收到机器人错误消息,我收到的最新消息与第一个有点不同。
最近更新 更多