68 votes

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")}
    })        
}

J'obtiens une erreur de compilation, si addTarget est supprimé, la compilation est réussie.

0 votes

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

0 votes

handleRegister action sont dans le même contrôleur ? De même, vous n'avez pas défini le cadre de l'action de UIButton .

0 votes

Oui, j'ai une autre fonction pour ses contraintes func constraints() {loginRegisterButton.centerXAnchor.constraint(equalTo : inputview.centerXAnchor).isActive = true loginRegisterButton.topAnchor.constraint(equalTo : inputview. bottomAnchor, constant : 12).isActive = true loginRegisterButton.widthAnchor.constraint(equalTo : inputview.widthAnchor).isActive = true loginRegisterButton.heightAnchor.constraint(equalToConstant : 30).isActive = true }

117voto

Damien Points 468

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

Editar:

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

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

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

1 votes

Ok c'est très facile mais comment ajouter un exemple de valeur button.addTarget(self, action:#selector(handleRegister(str: "Hello")), for: .touchUpInside) ?

0 votes

Vous ne pouvez pas définir de paramètre dans un sélecteur . L'action dépend de l'origine de la cible. Si vous voulez obtenir la chaîne du bouton, récupérez-la de l'expéditeur dans handleRegister(sender : UIButton) let string = sender. currentTitle

0 votes

L'une des solutions consiste à définir le paramètre comme élément d'accessibilité du bouton. Mais je ne sais pas si cette solution est acceptée par l'App Store, car je n'ai essayé que pour les applications d'entreprise.

28voto

Soumen Points 1223

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

1 votes

Ce n'est pas un gros problème, mais n'y a-t-il toujours pas de moyen de le faire sans exposer à @objc ?

6 votes

Comme la documentation officielle d'Apple ( developer.apple.com/documentation/swift/ ), vous devez utiliser @objc pour appeler votre méthode de sélection. Il n'y a pas d'autre moyen "pur swift" d'utiliser le sélecteur.

15voto

VRAwesome Points 2674

Essayez ceci

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

Il suffit d'ajouter des parenthèses avec le nom de la méthode.

Vous pouvez également consulter le lien : La valeur du type 'CustomButton' n'a pas de membre 'touchDown'.

0 votes

En fait, n'ajoutez pas de paranthèses.

8voto

Giang Points 1208
  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) {

    }

7voto

user1823043 Points 1

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)    
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X