2014-07-08 5 views
57

Wie kann die Aktion für ein benutzerdefiniertes UIBarButtonItem in Swift festgelegt werden?So legen Sie die Aktion für ein UIBarButtonItem in Swift fest

Der folgende Code platziert erfolgreich auf den Button in der Navigationsleiste:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil) 
self.navigationItem.rightBarButtonItem = b 

Nun würde Ich mag func sayHello() { println("Hello") } anrufen, wenn die Taste berührt wird. Meine Bemühungen bisher:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:sayHello:) 
// also with `sayHello` `sayHello()`, and `sayHello():` 

und ..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(sayHello:)) 
// also with `sayHello` `sayHello()`, and `sayHello():` 

und ..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(self.sayHello:)) 
// also with `self.sayHello` `self.sayHello()`, and `self.sayHello():` 

Beachten Sie, dass sayHello() im Intellisense angezeigt wird, aber nicht funktioniert.

Danke für Ihre Hilfe.

EDIT: Für die Nachwelt folgende Arbeiten:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello") 
+3

Sie Selektoren in geschickter Pass nur durch den Wähler in einem String setzen, 'Aktion: "sayHello"' – Jiaaro

+0

Sie so viel Dank. Ich bin unter Druck, das rauszukriegen und war frustriert. – kmiklas

+1

Diese Frage wurde zuvor als ein Duplikat von [@selector() in Swift?] Markiert (http://stackoverflow.com/questions/24007650/selector-in-swift). Diese Frage fragt jedoch speziell nach 'UIBarButtonItem', während die andere nicht. Wenn Anfänger gezwungen sind, alle Verwendungen von Selektor zu verallgemeinern, kann das für sie schwierig sein. Daher entferne ich den doppelten Status, damit die Leute diese Frage auf dem neuesten Stand halten können. – Suragch

Antwort

128

Ab Swift 2.2 gibt es eine spezielle Syntax für Compiler-Zeit-Selektoren überprüft. Es verwendet die Syntax: #selector(methodName).

Swift 3 und höher:

var b = UIBarButtonItem(
    title: "Continue", 
    style: .plain, 
    target: self, 
    action: #selector(sayHello(sender:)) 
) 

func sayHello(sender: UIBarButtonItem) { 
} 

Wenn Sie unsicher sind, was die Methodennamen aussehen sollte, gibt es eine spezielle Version des Kopierbefehl, die sehr hilfreich ist. Setzen Sie den Cursor irgendwo in der Basismethodennamen (z sayHello) und drücken Umschalttaste + Steuerung + Option + C. Dadurch wird der Symbolname auf Ihrer Tastatur eingefügt. Wenn Sie auch Command halten, kopiert es den 'Qualified Symbol Name', der auch den Typ enthält.

Swift 2.3:

var b = UIBarButtonItem(
    title: "Continue", 
    style: .Plain, 
    target: self, 
    action: #selector(sayHello(_:)) 
) 

func sayHello(sender: UIBarButtonItem) { 
} 

Dies liegt daran, dass der erste Parameter Name nicht in Swift 2.3 ist erforderlich, wenn ein Methodenaufruf zu machen.

Sie können hier mehr über die Syntax auf swift.org lernen: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors

+10

Nur um zu erwähnen, dass die Aktionsfunktion nicht ** privat ** sein kann!Ich bin nicht wirklich sicher, warum, aber ich bekomme immer einen Fehler, wenn ich den Namen einer privaten Funktion – maddob

+0

Ich habe dies: "implementiert methodSignatureForSelector" – AlamoPS

+1

@AlamoPS Wenn Sie die zweite Version mit dem Doppelpunkt verwenden, Sie muss sicherstellen, dass die Funktionsparameter-Typen mit denen für jede Aktion übereinstimmen, die Sie bearbeiten. – Jason

Verwandte Themen