2017-07-06 68 views
1

我有一个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) 
    } 
} 

回答

0

,可以将其分为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 
    } 
} 
+0

非常感谢您的快速回复,但请详细解释它将如何解决问题?我没有检查,但我不想复制和粘贴代码。 – Sargot

+0

由于您已经为您的2个按钮设置了'tag',并且您为它们使用了相同的事件,因此在'onButtonTapped'中,您需要将按钮(发件人)作为参数传递。通过这样做,当您在视图控制器中分配实际功能时,您知道哪个按钮已被点击。 – Lawliet

+0

是的,我明白如何检查cellForIndexPath中的标记,这对于为多个按钮执行不同的操作不是问题。问题是,我不知道如何在prepareForSegue中做到这一点,以显示基于按钮的数据。 – Sargot

相关问题