【问题标题】:Pass data depends on the button in tableView cell传递数据取决于 tableView 单元格中的按钮
【发布时间】:2017-12-11 03:30:04
【问题描述】:

我有一个 TableView,我在其中显示所有数据,每个单元格可能有 1-2 个按钮。我阅读了许多主题并了解如何通过我的 ViewController 为每个按钮添加目标。由于这些按钮将被转发到同一个VC并显示图像,我有以下代码。在我的 TableViewCell 子类中,我有 2 个按钮

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

为了通过 segue 传递数据,我在 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)
   }
}

【问题讨论】:

    标签: ios swift uitableview segue


    【解决方案1】:

    您可以将其分成 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 时,如果您曾经使用过self,请记住添加[weak self] 以避免保留循环。

    cell.onButtonTapped = { [weak self] sender in
        if sender.tag == 1 {
            // Do something
        } else {
            // Do other thing
        }
    }
    

    【讨论】:

    • 非常感谢您的快速回复,但能否更详细地解释一下它将如何解决问题?我还没有检查这个,但我不想只是复制和粘贴代码。
    • 因为您已经为您的 2 个按钮设置了 tag 并且您为它们使用相同的事件,所以在 onButtonTapped 中您需要将按钮(发送者)作为参数传递。通过这样做,当您在视图控制器中分配一个实际功能时,您就知道哪个按钮被点击了。
    • 是的,我了解如何检查 cellForIndexPath 中的标签,并且为多个按钮执行不同的操作不是问题。问题是我不知道如何在 prepareForSegue 中执行此操作才能根据按钮显示数据。
    • 关于使用prepare:forSegueonButtonTapped导航到另一个视图控制器,你可以看看stackoverflow.com/a/44779326/7113238。这是一个非常相似的案例,我已经解释了为什么你应该使用它们中的任何一个。
    • 感谢您的热情回复。如果有任何问题,我会检查并更新我的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多