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
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)
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'
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(){
//...
}
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)
}
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) {
}
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.
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 .
essayez ceci avec Swift 3
button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside)
bonne chance!
au lieu de
let loginRegisterButton:UIButton = {
//... }()
, Essayez:
lazy var loginRegisterButton:UIButton = {
//... }()
qui devrait corriger l'erreur de compilation!!!