Comment utiliser la méthode addTarget dans 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")}
    })        
}

je reçois une erreur de compilation, si addTarget est supprimé, il compile avec succès

41
demandé sur Honey 2016-09-21 16:24:14

9 réponses

Oui, ne pas ajouter de "()" si il n'y a pas de param

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

Edit:

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

ne fonctionne plus, vous devez remplacer _ dans le sélecteur avec un nom de variable utilisé dans l'en-tête de fonction, dans ce cas, il serait sender , de sorte que le code de travail devient:

button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside)
80
répondu Damien Romito 2017-01-17 16:25:24

Essayez cette

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

il suffit d'ajouter une parenthèse avec le nom de la méthode.

vous pouvez aussi renvoyer le lien: valeur de type 'CustomButton' n'a pas de membre 'touchDown'

13
répondu VRAwesome 2017-05-23 12:03:08

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(){
    //...
}
10
répondu Soumen 2018-03-26 03:11:04

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
répondu eranda.del 2018-03-26 03:12:20
  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) {

    }
6
répondu Giang 2018-03-26 07:35:53

dans swift 3 Utilisez ce -

object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents)

par exemple (de mon code) -

self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged)

il suffit de donner un : après le nom de la méthode si vous voulez l'expéditeur comme paramètre.

2
répondu Nikhil Manapure 2016-12-03 09:18:45

le deuxième commentaire de l'affiche du 21 septembre est affiché. 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 avec le mot-clé let sont des constantes. Bien sûr, si vous allez à ajouter des éléments à un tableau, le tableau ne peut pas être déclaré comme une constante, mais un contrôle segmenté devrait être bien, non?! Pas si vous mentionnez le contrôle segmenté complété dans sa déclaration.

référencement de l'objet (dans ce cas un UISegmentedControl , mais cela se produit aussi avec UIButton ) dans sa déclaration quand vous dites .addTarget et que la cible soit self , les choses s'écrasent. 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 paresse comme une variable avec var . Le lazy fait croire au compilateur que self est bien défini - il empêche votre compilateur de prendre soin au moment de la déclaration. Les variables déclarées paresseusement ne sont pas définies avant d'avoir été appelées. Donc, dans cette situation, lazy vous permet d'utiliser la notion de self sans problème pendant que vous configurez l'objet, puis, lorsque votre objet devient un .touchUpInside ou .valueChanged ou quel que soit votre troisième argument dans votre .addTarget() , puis il fait appel à la notion de self , qui à ce point est pleinement établi 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é comme necessary , 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'il

il n'y a pas de lazy let dans Swift (pas de lazy pour les constantes).

, Voici le dans la documentation d'Apple sur paresseux .

, Voici le d'Apple sur les variables et les constantes . Il y a un peu plus dans leur référence linguistique sous déclarations .

1
répondu hlp 2016-12-07 05:45:36

essayez ceci avec Swift 3

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

bonne chance!

1
répondu Sultan Elerris 2017-02-03 02:06:11

au lieu de

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

, Essayez:

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

qui devrait corriger l'erreur de compilation!!!

1
répondu Edward Pizzurro 2017-06-20 23:27:48