2016-06-17 3 views
3

ist es möglich, eine int-Variable über einen Selektor, z. #selector (run (1)) oder #selector (run (2))Hinzufügen statischen Parameter zu #Selector in Swift

Mehr bei Bedarf den Kontext:

let button = UIBarButtonItem(title: "Run", 
             style: UIBarButtonItemStyle.Plain, 
             target: self, 
             action: #selector(run(1))) 

Antwort

4

Nach einem gewissen iOS Entwickler bestätigt haben, nicht Sie können dies noch nicht tun.

Aber es gibt eine Alternative. Sie können das Absenderobjekt in der Aktionsmethode empfangen. Sie können der Absenderklasse eine beliebige Eigenschaft hinzufügen. Und empfange das in Aktionsmethode.

zum Beispiel:

Erster Ansatz

let button = UIBarButtonItem(title: "Run", 
            style: .Plain, 
            target: self, 
            action: #selector(run(_:))) 
button.tag = 1 

Und Sie können es wie dieses

func run(sender: UIBarButtonItem) { 
    let passedInteger = sender.tag 
} 

empfangen Aber es funktioniert nur, wenn der übergebene Parameter ein einzelner Integer ist. Hier ist, wie Sie es tun können, wenn Sie mehrere Parameter mit einem beliebigen Datentyp übergeben wollen -> Blick auf Second-Ansatz

Zweiter Ansatz

Subclass UIBarButtonItem

class MyBarButtonItem: UIBarButtonItem { 
    var passedParameter: String? 
} 

Und erhalten es so

let button = MyBarButtonItem(title: "Run", 
            style: .Plain, 
            target: self, 
            action: #selector(run(sender:))) 

button.passedParameter = "John Doe" 

func run(sender: MyBarButtonItem) { 
    // now you have the parameter 
    let parameter = sender.passedParameter 
} 
+0

Sie bitte Ihre Antwort nicht wesentlich ändern, nachdem es angenommen wurde. – xoogler

0

Nein, aber als Edward erwähnt, kann es möglich sein, Werte, um durch die Schaltfläche selbst.

let button = UIBarButtonItem(title: "Run", 
            style: UIBarButtonItemStyle.Plain, 
            target: self, 
            action: #selector(run(_:))) 
button.tag = 1 

.....

func run(sender: UIButton){ 
    doSomething(sender.tag) 
} 

Werte durch Tags vorbei nicht empfohlen, aber dies ist ein Weg