web-dev-qa-db-fra.com

Comment utiliser la méthode addTarget dans Swift 3

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.

50
Ninja13

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)
92
Damien Romito

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(){
    //...
}
18
Soumen

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'

13
VRAwesome
  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) {

    }
7
Giang

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)    
}
7
eranda.del

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.

3
Nikhil Manapure

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 .

1
hlp

Essayez ceci avec Swift 3

button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside)

Bonne chance!

1
S E

Au lieu de

let loginRegisterButton:UIButton = {
//...  }()

Essayer:

lazy var loginRegisterButton:UIButton = {
//...  }()

Cela devrait corriger l'erreur de compilation !!!

1
Edward Pizzurro