2017-10-16 11 views
0

Je crée une calculatrice simple et j'ai mis quelques boutons numériques dans un @IBAction. J'accéder au sender.title d'un bouton enfoncé pour mettre à jour l'étiquette d'entrée comme ceci:Swift: Comment accéder à un objet (par exemple un bouton) dans une collection @IBAction pour renvoyer un expéditeur à une nouvelle fonction?

@IBAction func numberButtonTapped(_ sender: UIButton) { 
     guard let numberButton = sender.title(for: .normal) else {return} 

     updateInput(num: numberButton) 
    } 

Maintenant, je voudrais animer chaque bouton appuyé par un simple CGAffineTransform (je sais comment cela se fait) et je peux mettre l'animation dans le @IBAction et évidemment cela fonctionne:

@IBAction func numberButtonTapped(_ sender: UIButton) { 
     guard let numberButton = sender.title(for: .normal) else {return} 

     sender.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) // completion handler to reverse the animation 

     updateInput(num: numberButton) 
    } 

Mais je voudrais mettre l'animation dans une autre fonction pour que je puisse y accéder à partir de différents @IBActions et ne pas avoir à réécrire le code encore et encore , mais je n'ai aucune idée de comment je peux transférer le "expéditeur" à la nouvelle fonction. Alors comment je dirais la nouvelle fonction (appelons-le animateButton()) quel expéditeur a été pressé de sorte que le sender.transform = CGAffineTransform (scaleX: 1.2, y: 1.2) ... sait quel bouton animer?

Merci

Répondre

2

Créer une fonction qui reçoit un UIButton comme paramètre avec votre code d'animation à l'intérieur:

func animateButton(anySender: UIButton) { 
    // Your animation code here 
    sender.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) // completion handler to reverse the animation 
} 

Appelez votre animation dans une fonction qui nécessite l'animation, en passant votre expéditeur paramètre:

@IBAction func numberButtonTapped(_ sender: UIButton) { 
     guard let numberButton = sender.title(for: .normal) else {return} 

     animateButton(anySender: sender) 
     updateInput(num: numberButton) 
    } 

EXTRA: si vous avez besoin d'appeler cette fonction de différents contrôleurs, envisager d'en faire un extension:

extension UIButton { 
    func customAnimate() { 
     // Your animation code here 
     self.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) // completion handler to reverse the animation 
    } 
} 

et l'appeler de tout bouton:

@IBAction func numberButtonTapped(_ sender: UIButton) { 
     guard let numberButton = sender.title(for: .normal) else {return} 

     sender.customAnimate() 
     updateInput(num: numberButton) 
    } 
+0

Merci. Je n'ai pas pensé aux extensions. Cela fonctionne bien! – RjC