2017-07-06 1 views
1

J'ai un TableView dans lequel toutes les données sont affichées et chaque cellule peut contenir 1 ou 2 boutons. J'ai lu beaucoup de sujets et je comprends comment ajouter une cible pour chaque bouton via mon ViewController. Puisque ces boutons seront transmis au même VC et afficheront des images, j'ai le code suivant. Dans ma sous-classe TableViewCell J'ai 2 boutonsLa transmission des données dépend du bouton de la cellule 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") 
    } 
} 

Dans mon ViewController dans cellForRowAt indexPath Je le code suivant

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 

Afin de transmettre les données par Segue-je utiliser le code suivant dans prepareForSegue

Tout fonctionne en mode FINE mais je ne peux pas vérifier la balise button dans prepareForSegue. Fondamentalement, actuellement les deux boutons envoient les mêmes données

targetController.loadImageURL = URL(string: data.firstImageUrl) 

Comment puis-je transmettre des données en fonction du bouton enfoncé? J'ai essayé de faire quelque chose comme ça, mais il semble que ce soit faux et ne fonctionne pas.

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

Répondre

0

Vous pouvez le séparer en 2 différents événements ou

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") 
    } 
} 

Dans votre affectation du onButtonTapped, souvenez-vous d'ajouter [weak self] si jamais vous utilisez self pour éviter le cycle retenir.

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

Merci beaucoup pour votre réponse rapide, mais pourriez-vous expliquer plus en détail comment cela va résoudre le problème? Je n'ai pas encore vérifié mais je ne veux pas simplement copier et coller le code. – Sargot

+0

Comme vous avez déjà défini 'tag' sur vos 2 boutons et que vous utilisez le même événement pour eux, dans' onButtonTapped' vous devez passer le bouton (expéditeur) en argument. Ce faisant, lorsque vous affectez une fonction réelle dans le contrôleur de vue, vous savez quel bouton a été tapé. – Lawliet

+0

Oui, je comprends comment vérifier l'étiquette dans cellForIndexPath et ce n'est pas un problème pour effectuer différentes actions pour plusieurs boutons. Le problème est que je ne sais pas comment le faire dans prepareForSegue afin d'afficher les données basées sur le bouton. – Sargot