Comment utiliser addTarget méthode swift 3
voici mon button
objet
let loginRegisterButton:UIButton = {
let button = UIButton(type: .system)
button.backgroundColor = UIColor(r: 50 , g: 80, b: 130)
button.setTitle("Register", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitleColor(.white, for: .normal)
button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside)
return button
}()
et voici ma fonction
func handleRegister(){
FIRAuth.auth()?.createUser(withEmail: email, password: password,completion: { (user, error) in
if error != nil
{ print("Error Occured")}
else
{print("Successfully Authenticated")}
})
}
J'obtiens le message d'erreur de compilation, si addTarget retiré, il compile correctement
- Essayez cette
button.addTarget(self, action:#selector(handleRegister()), for: .touchUpInside)
. handleRegister
l'action sont dans le même contrôleur? Aussi, vous havn't définir le cadre deUIButton
.- oui, j'ai une autre fonction de ses contraintes func contraintes() {loginRegisterButton.centerXAnchor.contrainte(equalTo: inputview.centerXAnchor).est actif = true loginRegisterButton.topAnchor.contrainte(equalTo: inputview.bottomAnchor, une constante: 12).est actif = true loginRegisterButton.widthAnchor.contrainte(equalTo: inputview.widthAnchor).est actif = true loginRegisterButton.heightAnchor.contrainte(equalToConstant: 30).est actif = true }
- Puis le problème est peut-être avec votre bouton de contraintes essayer de mettre juste l'image une fois et vérifier qu'il fonctionne ou pas.
- j'ai modifié le code comme ceci et il a travaillé paresseux var loginRegisterButton:UIButton = { laisser bouton = UIButton(type: .système de bouton.backgroundColor = UIColor(r: 50 , g: 80, b: 130) bouton.setTitle("Enregistrer", pour: .normale) bouton.translatesAutoresizingMaskIntoConstraints = false bouton.setTitleColor(.blanc, pour: .normale) bouton.addTarget(auto, action:#sélecteur(handleRegister), pour: .touchUpInside) bouton de retour }()
Vous devez vous connecter pour publier un commentaire.
Oui, ne pas ajouter de "()" si il n'y a pas de param
et si vous voulez obtenir de l'expéditeur
Edit:
ne fonctionne plus, vous avez besoin de remplacer
_
dans le sélecteur avec un nom de variable utilisé dans l'en-tête de fonction, dans ce cas, il seraitsender
, de sorte que le code de travail devient:button.addTarget(self, action:#selector(handleRegister(str: "Hello")), for: .touchUpInside)
?Essayer cela avec Swift 4
Essayer cette
Juste ajouter une parenthèse avec le nom de la méthode.
Aussi, vous pouvez consulter le lien : Valeur de type 'CustomButton' est pas membre de 'touchDown'
Essayer avec swift 3
Dans swift 3 utilisez ce -
Par exemple(à partir de mon code) -
Juste donner un
:
après le nom de la méthode si vous voulez l'expéditeur en tant que paramètre.L'affiche de la deuxième commentaire du 21 septembre est sur place. Pour ceux qui peuvent venir à ce fil plus tard avec le même problème que l'affiche, voici une brève explication. Les autres réponses sont bonnes à garder à l'esprit, mais n'abordent pas les problèmes communs rencontrés par le présent code.
Dans Swift, les déclarations faites à la
let
mot-clé sont des constantes. Bien sûr, si vous allez à ajouter des éléments à un tableau, le tableau ne peut pas être déclarée comme une constante, mais une segmentation de contrôle devrait être bon, non?!!! Pas si vous faites référence le formulaire de commande segmentée dans sa déclaration.Faisant référence à l'objet (dans ce cas, un
UISegmentedControl
, mais cela arrive aussi avecUIButton
) dans sa déclaration quand vous dites.addTarget
et laissez la cible seself
, les choses se bloquer. Pourquoi? Parce queself
est en train d'être défini. Mais nous ne voulons définir le comportement en tant que partie de l'objet... le Déclarer paresseusement comme une variable avecvar
. Lelazy
fous le compilateur en pensant queself
est bien définie - il des silences votre compilateur de prise en charge au moment de la déclaration. Paresseusement les variables déclarées à ne pas obtenir de définir jusqu'à ce qu'ils sont d'abord appelés. Donc, dans cette situation,lazy
vous permet d'utiliser la notion deself
sans problème pendant que vous configurez l'objet, puis, lorsque votre objet devient un.touchUpInside
ou.valueChanged
ou quel que soit votre 3ème argument est dans votre.addTarget()
, PUIS il en appelle à la notion deself
, ce qui est parfaitement en place et totalement prêt à être une cible valide. Donc, il vous permet d'être paresseux dans la déclaration des variables. Dans ces cas, je pense qu'ils pourraient nous donner un mot clé commenecessary
, mais il est généralement considéré comme un paresseux, sales pratique et vous ne voulez pas l'utiliser partout dans votre code, bien qu'il puisse avoir sa place dans ce genre de situation. Ce qu'ilIl n'y a pas de
lazy let
rapide (pas delazy
pour les constantes).Ici est la La documentation d'Apple sur paresseux.
Ici est la Apple sur les variables et les constantes. Il y a un peu plus dans leur Langue de Référence en vertu de l' Les déclarations.
Essayer cela avec Swift 3
Bonne chance!
Au lieu de
Essayer:
Qui doit réparer l'erreur de compilation!!!