2017-07-26 2 views
0

J'ai créé un composant UIView, à l'intérieur il a 2 boutons. Lorsqu'un utilisateur touche les boutons, je dois appeler une méthode d'action de ViewController.Comment obtenir une action sur un bouton enfoncé dans un composant à viewcontroller

J'ai essayé de passer un sélecteur, mais il accident:

sur ViewController

component.leftAction = #selector(ViewController.myAction) 

func myAction(sender: UIButton!) { 
    print("tapped!") 
} 

sur Component.swift

public var leftAction: Selector? { 
    didSet { 
     if (leftAction != nil){ 
      self.leftButton.addTarget(self, action: leftAction!, for: .touchUpInside) 
     } 
    } 
} 

Comment puis-je faire?

+0

Quelle version de Swift utilisez-vous? Dans Swift3, la syntaxe du sélecteur a changé. Il doit être '#selector (ViewController.myAction)' –

+0

@ DávidPásztor Quoi qu'il en soit, il se bloque: "sélecteur non reconnu envoyé à l'instance" –

+0

Pourquoi ne pas simplement ajouter "addTarget" au bouton au lieu de le passer par une variable de sélection? – Malik

Répondre

2

Il plante parce que la cible du bouton est incorrecte. Dans votre cas, vous passez la cible comme self qui est une instance de classe Component. La cible doit être votre instance ViewController car votre sélecteur est défini dans votre classe ViewController.

Vous pouvez faire quelque chose comme ceci pour résoudre votre problème.

public var leftTargetAction: (Any, Selector)? { 
    didSet { 
     if let targetAction = leftTargetAction { 
      self.leftButton.addTarget(targetAction.0, action: targetAction.1, for: .touchUpInside) 
     } 
    } 
}  

Et l'utiliser comme ça.

component.leftTargetAction = (self,#selector(ViewController.myAction)) 
0

Une meilleure approche serait de gérer cela avec les délégués. Pour en savoir plus sur le délégué, vous pouvez go through this post.

0

il suffit de changer

component.leftAction = #selector(ViewController.myAction) 

à

component.leftAction = #selector(ViewController.myAction(sender:)) 

Et ViewController ne devrait pas être désallouée.