Wie kann die Aktion für ein benutzerdefiniertes UIBarButtonItem in Swift festgelegt werden?
Der folgende Code platziert die Schaltfläche erfolgreich in der Navigationsleiste:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil)
self.navigationItem.rightBarButtonItem = b
Jetzt möchte ich anrufen, func sayHello() { println("Hello") }
wenn die Taste berührt wird. Meine bisherigen Bemühungen:
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 dies sayHello()
im Intellisense angezeigt wird, aber nicht funktioniert.
Danke für Ihre Hilfe.
EDIT: Für die Nachwelt funktionieren folgende Werke:
var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")
ios
swift
action
uibarbuttonitem
kmiklas
quelle
quelle
action: "sayHello"
UIBarButtonItem
während die andere dies nicht tut. Esselector
kann für sie schwierig sein, Anfänger zu verpflichten, alle Verwendungen von zu verallgemeinern. Daher entferne ich den doppelten Status, damit die Leute diese Frage auf dem neuesten Stand halten können.Antworten:
Ab Swift 2.2 gibt es eine spezielle Syntax für Selektoren, die zur Compilerzeit überprüft wurden. Es verwendet die Syntax :
#selector(methodName)
.Swift 3 und höher:
Wenn Sie sich nicht sicher sind, wie der Methodenname aussehen soll, gibt es eine spezielle Version des Kopierbefehls, die sehr hilfreich ist. Setzen Sie den Cursor irgendwo in der Basismethodennamen (zB sayHello) und drücken Sie Shift+ Control+ Option+ C. Dadurch wird der Symbolname auf Ihrer Tastatur eingefügt. Wenn Sie auch gedrückt halten Command, wird der 'Name des qualifizierten Symbols' kopiert, der auch den Typ enthält.
Swift 2.3:
Dies liegt daran, dass der erste Parametername in Swift 2.3 beim Ausführen eines Methodenaufrufs nicht erforderlich ist.
Weitere Informationen zur Syntax auf swift.org finden Sie hier: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors
quelle
Selector("sayHello")
ohnehin von Swift hinter die Kulissen übersetzt .Schnelles 4/5-Beispiel
quelle
@objc
der Funktionsdeklaration hinzufügen . Bis Swift 4 wurde dies implizit abgeleitet.button.target = self
Möge dieser etwas mehr helfen
Angenommen, Sie möchten die Balkenschaltfläche in einer separaten Datei erstellen (für einen modularen Ansatz) und Ihrem Ansichtscontroller den Selektor zurückgeben. Gehen Sie dazu folgendermaßen vor:
Ihre Utility-Datei
Erstellen Sie dann eine SuperviewController-Klasse und definieren Sie dieselbe Funktion darauf.
und In unserem Basis-ViewController (der Ihre SuperviewController-Klasse erbt) wird dieselbe Funktion überschrieben
Erben Sie jetzt einfach den SuperViewController in der Klasse, in der Sie diesen Barbutton haben möchten.
Danke für das Lesen
quelle
Swift 5
Wenn Sie
UIBarButtonItem
in Interface Builder erstellt haben und die Steckdose mit dem Element verbunden haben und den Selektor programmgesteuert binden möchten.Vergessen Sie nicht, Ziel und Auswahl festzulegen.
quelle
Swift 5 & iOS 13+ Programmatisches Beispiel
@objc
, siehe Beispiel unten!#selector(name)
.private
oderpublic
spielt keine Rolle; Sie können privat verwenden.Codebeispiel
quelle