Comment l'action pour un UIBarButtonItem personnalisé dans Swift peut-elle être définie?
Le code suivant place avec succès le bouton dans la barre de navigation:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil)
self.navigationItem.rightBarButtonItem = b
Maintenant, je voudrais appeler func sayHello() { println("Hello") }
lorsque le bouton est touché. Mes efforts jusqu'à présent:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:sayHello:)
// also with `sayHello` `sayHello()`, and `sayHello():`
et..
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(sayHello:))
// also with `sayHello` `sayHello()`, and `sayHello():`
et..
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(self.sayHello:))
// also with `self.sayHello` `self.sayHello()`, and `self.sayHello():`
Notez que sayHello()
apparaît dans l'intellisense, mais ne fonctionne pas.
Merci de votre aide.
EDIT: Pour la postérité, les œuvres suivantes:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")
A partir de Swift 2.2, il existe une syntaxe spéciale pour les sélecteurs vérifiés à la compilation. Il utilise la syntaxe: #selector(methodName)
.
Swift 3 et versions ultérieures:
var b = UIBarButtonItem(
title: "Continue",
style: .plain,
target: self,
action: #selector(sayHello(sender:))
)
func sayHello(sender: UIBarButtonItem) {
}
Si vous n'êtes pas sûr du nom de la méthode, il existe une version spéciale de la commande copy très utile. Placez votre curseur quelque part dans le nom de la méthode de base (par exemple, sayHello) et appuyez sur Shift+Control+Option+C. Cela met le "Nom du symbole" sur votre clavier à coller. Si vous détenez aussi Command il copiera le ‘Nom du symbole qualifié’, qui inclura également le type.
Swift 2.3:
var b = UIBarButtonItem(
title: "Continue",
style: .Plain,
target: self,
action: #selector(sayHello(_:))
)
func sayHello(sender: UIBarButtonItem) {
}
En effet, le premier nom de paramètre n'est pas requis dans Swift 2.3 lors d'un appel de méthode.
Vous pouvez en apprendre davantage sur la syntaxe sur Swift.org ici: https://Swift.org/blog/Swift-2-2-new-features/#compile-time-checked-selectors
Swift 4 exemple
button.action = #selector(buttonClicked(sender:))
@objc func buttonClicked(sender: UIBarButtonItem) {
}
Dans Swift 4, nous devons ajouter @objc avant la méthode d’action.
Voir l'exemple suivant:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Select", target: self, action: #selector(selectAction(_:)))
@objc func selectAction(_ sender:UIBarButtonItem) -> Void {
print("Select Clicked")
}