voici mon objet button
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")}
})
}
Je reçois une erreur de compilation. Si addTarget est supprimé, il est compilé avec succès.
Oui, n'ajoutez pas "()" s'il n'y a pas de paramètre
button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside).
et si vous voulez obtenir l'expéditeur
button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside).
func handleRegister(sender: UIButton){
//...
}
Modifier:
button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside)
ne fonctionne plus, vous devez remplacer _
dans le sélecteur par un nom de variable que vous avez utilisé dans l'en-tête de la fonction. Dans ce cas, il s'agirait de sender
. Le code de travail devient:
button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside)
Essayez ceci avec Swift 4
buttonSection.addTarget(self, action: #selector(actionWithParam(_:)), for: .touchUpInside)
@objc func actionWithParam(sender: UIButton){
//...
}
buttonSection.addTarget(self, action: #selector(actionWithoutParam), for: .touchUpInside)
@objc func actionWithoutParam(){
//...
}
Essaye ça
button.addTarget(self, action:#selector(handleRegister()), for: .touchUpInside).
Ajoutez simplement des parenthèses avec le nom de la méthode.
Vous pouvez également consulter le lien: La valeur de type 'CustomButton' n'a pas de membre 'touchDown'
let button: UIButton = UIButton()
button.setImage(UIImage(named:"imagename"), for: .normal)
button.addTarget(self, action:#selector(YourClassName.backAction(_sender:)), for: .touchUpInside)
button.frame = CGRect.init(x: 5, y: 100, width: 45, height: 45)
view.addSubview(button)
@objc public func backAction(_sender: UIButton) {
}
Essayez avec Swift 3
cell.TaxToolTips.tag = indexPath.row
cell.TaxToolTips.addTarget(self, action: #selector(InheritanceTaxViewController.displayToolTipDetails(_:)), for:.touchUpInside)
@objc func displayToolTipDetails(_ sender : UIButton) {
print(sender.tag)
let tooltipString = TaxToolTipsArray[sender.tag]
self.displayMyAlertMessage(userMessage: tooltipString, status: 202)
}
Dans Swift 3, utilisez ceci -
object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents)
Par exemple (de mon code) -
self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged)
Donnez juste un :
après le nom de la méthode si vous voulez que l'expéditeur soit un paramètre.
Le deuxième commentaire de l'affiche du 21 septembre est sur place. Pour ceux qui viendront plus tard sur ce sujet 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 le problème commun rencontré par ce code.
Dans Swift, les déclarations effectuées avec le mot clé let
sont des constantes. Bien sûr, si vous alliez ajouter des éléments à un tableau, le tableau ne peut pas être déclaré comme une constante, mais un contrôle segmenté devrait suffire, non?! Pas si vous référencez le contrôle segmenté terminé dans sa déclaration.
Référencement de l'objet (dans ce cas une UISegmentedControl
, mais cela se produit également avec UIButton
) dans sa déclaration lorsque vous dites .addTarget
et que la cible soit self
, les choses se bloquent. Pourquoi? Parce que self
est en train d'être défini. Mais nous voulons définir le comportement comme faisant partie de l'objet ... Déclarez-le paresseusement comme une variable avec var
. La lazy
trompe le compilateur en lui faisant croire que self
est bien défini - il empêche votre compilateur de se soucier au moment de la déclaration. Les variables déclarées par défaut ne sont pas définies avant leur appel initial. Donc, dans cette situation, lazy
vous permet d'utiliser la notion de self
sans problème pendant la configuration de l'objet, puis lorsque votre objet obtient un .touchUpInside
ou .valueChanged
ou autre votre 3ème argument est dans votre .addTarget()
, PUIS, il fait appel à la notion de self
, qui est alors pleinement établi et totalement préparé à être une cible valable. Cela vous permet donc d’être paresseux dans la déclaration de votre variable. Dans de tels cas, je pense qu'ils pourraient nous donner un mot clé tel que necessary
, mais il est généralement considéré comme une pratique paresseuse et négligée et vous ne souhaitez pas l'utiliser dans tout votre code, bien qu'il puisse avoir son placer dans ce genre de situation. Ce que c'est
Il n'y a pas de lazy let
dans Swift (pas de lazy
pour les constantes).
Voici le documentation Apple sur les paresseux .
Voici le Apple sur les variables et les constantes . Il y a un peu plus dans leur référence de langage sous Déclarations .
Essayez ceci avec Swift 3
button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside)
Bonne chance!
Au lieu de
let loginRegisterButton:UIButton = {
//... }()
Essayer:
lazy var loginRegisterButton:UIButton = {
//... }()
Cela devrait corriger l'erreur de compilation !!!