检测按钮被点击的单元格
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]
}
}
在 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 从 视图控制器(而不是从 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]
}
}