J'essaie de passer un paramètre supplémentaire à l'action buttonClicked, mais je ne peux pas déterminer quelle devrait être la syntaxe dans Swift.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
N'importe quelle méthode my buttonClicked:
func buttonClicked(sender:UIButton)
{
println("hello")
}
Quelqu'un a des idées?
Merci de votre aide.
WARNING TO INTERNET: please check out my answer at the bottom
Réponses:
Vous ne pouvez pas transmettre de paramètres personnalisés dans.
addTarget:
Une alternative est de définir latag
propriété de bouton et de travailler en fonction de la balise.Ou pour Swift 2.2 et supérieur:
Maintenant, faites de la logique basée sur la
tag
propriétéla source
Int
. Rien d'autre.Si vous souhaitez envoyer des paramètres supplémentaires à la méthode buttonClicked, par exemple un indexPath ou urlString, vous pouvez sous-classer l'UIButton:
Assurez-vous de changer la classe du bouton dans l'inspecteur d'identité en sous-classeUIButton. Vous pouvez accéder aux paramètres de la méthode buttonClicked en utilisant
sender.indexPath
ousender.urlString
.Remarque: Si votre bouton se trouve à l'intérieur d'une cellule, vous pouvez définir la valeur de ces paramètres supplémentaires dans la méthode cellForRowAtIndexPath (où le bouton est créé).
la source
J'apprécie que tout le monde dise utiliser des balises, mais vous devez vraiment étendre la classe UIButton et y ajouter simplement l'objet.
Les tags sont un moyen désespéré de contourner cela. Étendez l'UIButton comme ceci (dans Swift 4)
alors votre appel peut être call (NOTEZ LES deux points ":" in
Selector(("webButtonTouched:"))
)puis enfin attraper tout ici
Vous faites cela une fois et l'utilisez tout au long de votre projet (vous pouvez même faire en sorte que la classe enfant ait un "objet" générique et mettre ce que vous voulez dans le bouton!). Ou utilisez l'exemple ci-dessus pour mettre un nombre inépuisable de paramètres clé / chaîne dans le bouton. Vraiment utile pour inclure des choses comme des URL, confirmer la méthodologie de message, etc.
En passant, il est important que la
SO
communauté se rende compte qu'il y a toute une génération de mauvaises pratiques coupées et collées sur Internet par un nombre alarmant de programmeurs qui ne comprennent pas / n'ont pas été enseignés / ont raté le but de le concept deobject extensions
la source
Pour Swift 3.0, vous pouvez utiliser
la source
Swift 4.2
Résultat:
Dans le fichier,
UIButton+Events.swift
j'ai créé une méthode d'extension pourUIButton
qui lie unUIControl.Event
à un gestionnaire d'achèvement appeléEventHandler
:La raison pour laquelle j'ai utilisé une classe personnalisée pour lier l'événement est de pouvoir supprimer la référence plus tard lorsque le bouton est désintialisé. Cela évitera une éventuelle fuite de mémoire. Cela n'a pas été possible dans l'
UIButton
extension its, car je ne suis pas autorisé à implémenter une propriété ni ladeinit
méthode.la source
Si vous avez une boucle de boutons comme moi, vous pouvez essayer quelque chose comme ça
la source
Code Swift 4.0 (nous y revoilà)
L'action appelée doit être marquée comme ceci car c'est la syntaxe de la fonction swift pour exporter des fonctions dans un langage objectif c.
créer un bouton de travail:
la source
Code SWIFT 5.0
J'utilise theButton.tag mais si j'ai beaucoup de type d'option, c'est un boîtier de commutation très long.
.
la source
Pour Swift 2.X et supérieur
la source
Code Swift 3.0
Vous pouvez envoyer une valeur dans 'userinfo' et l'utiliser comme paramètre dans la fonction.
la source
C'est plus un commentaire important. Partage de références de sytanx qui est acceptable hors de la boîte. Pour les solutions de piratage, regardez d'autres réponses.
Selon la documentation d'Apple, les définitions de méthode d'action doivent être l'une de ces trois. Tout le reste n'est pas accepté.
la source