通过数据取决于tableView中的按钮单元格
问题描述:
我有一个TableView,我显示我的所有数据,每个单元格可能有1-2个按钮。我阅读了很多主题,并了解如何通过ViewController为每个按钮添加目标。由于这些按钮将被转发到相同的VC和显示图像,我有以下代码。在我的TableViewCell子类我有2个按钮通过数据取决于tableView中的按钮单元格
class CODetailsTicketCell: UITableViewCel {
var onButtonTapped: (() -> Void)? = nil
@IBAction func firstBtnTapped(_ sender: UIButton) {
if let onButtonTapped = self.onButtonTapped {
onButtonTapped()
}
print("First button was pressed")
}
@IBAction func secondBtnTapped(_ sender: UIButton) {
if let onButtonTapped = self.onButtonTapped {
onButtonTapped()
}
print("Second button was pressed")
}
}
在我在cellForRowAt indexPath的ViewController我有以下代码
let message = messages[indexPath.row]
if let cell = tableView.dequeueReusableCell(withIdentifier: "COTicketsCell", for: indexPath) as? CODetailsTicketCell {
cell.configureCell(openTickets: message)
cell.onButtonTapped = {
self.performSegue(withIdentifier: "toImageVC", sender: message)
}
return cell
为了通过赛格瑞我使用以下代码中prepareForSegue
传递数据override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toImageVC" {
let navigationController = segue.destination as? UINavigationController
if let targetController = navigationController?.topViewController as? ImageVC {
if let data = sender as? OpenTicketsData {
targetController.loadImageURL = URL(string: data.firstImageUrl)
}
}
}
}
一切正常工作,但我无法检查prepareForSegue中的按钮标记。基本上,目前这两个按钮发送相同的数据
targetController.loadImageURL = URL(string: data.firstImageUrl)
如何通过按下按钮传递数据?我试图做这样的事情,但似乎是错误的,不工作。
let button = sender as? UIButton
if let data = sender as? OpenTicketsData {
if button?.tag == 1 {
targetController.loadImageURL = URL(string: data.firstImageUrl)
} else if button?.tag == 2 {
targetController.loadImageURL = URL(string: data.secondImageUrl)
}
}
答
,可以将其分为2个不同的事件或
class CODetailsTicketCell: UITableViewCell {
var onButtonTapped: ((_ sender: UIButton) -> Void)? = nil
@IBAction func firstBtnTapped(_ sender: UIButton) {
if let onButtonTapped = self.onButtonTapped {
onButtonTapped?(sender)
}
print("First button was pressed")
}
@IBAction func secondBtnTapped(_ sender: UIButton) {
if let onButtonTapped = self.onButtonTapped {
onButtonTapped(sender)
}
print("Second button was pressed")
}
}
在你的onButtonTapped
的任务,记得要加[weak self]
如果你曾经使用self
避免保留周期。
cell.onButtonTapped = { [weak self] sender in
if sender.tag == 1 {
// Do something
} else {
// Do other thing
}
}
非常感谢您的快速回复,但请详细解释它将如何解决问题?我没有检查,但我不想复制和粘贴代码。 – Sargot
由于您已经为您的2个按钮设置了'tag',并且您为它们使用了相同的事件,因此在'onButtonTapped'中,您需要将按钮(发件人)作为参数传递。通过这样做,当您在视图控制器中分配实际功能时,您知道哪个按钮已被点击。 – Lawliet
是的,我明白如何检查cellForIndexPath中的标记,这对于为多个按钮执行不同的操作不是问题。问题是,我不知道如何在prepareForSegue中做到这一点,以显示基于按钮的数据。 – Sargot