2014-07-08 13 views
57

Jak można ustawić akcję dla niestandardowego obiektu UIBarButtonItem w Swift?Jak ustawić akcję dla UIBarButtonItem w Swift

Poniższy kod powodzeniem umieszcza przycisk na pasku nawigacyjnym:

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

Teraz chciałbym zadzwonić func sayHello() { println("Hello") } gdy przycisk jest dotykany. Moje wysiłki dotąd:

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

i ..

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

i ..

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

Zauważ, że pojawia się w sayHello() intellisense, ale nie działa.

Dzięki za pomoc.

EDIT: Dla potomności, następujące prace:

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

zdać selektorów w szybkich tylko przez umieszczenie przełącznika w ciąg, 'akcja:„sayHello”' – Jiaaro

+0

Dziękuję bardzo. Jestem pod presją, żeby to wydostać i byłem sfrustrowany. – kmiklas

+1

To pytanie zostało wcześniej oznaczone jako duplikat [@selector() w Swift?] (Http://stackoverflow.com/questions/24007650/selector-in-swift). Jednak to pytanie pyta konkretnie o 'UIBarButtonItem', podczas gdy inne nie. Wymaganie od początkujących uogólniania wszystkich zastosowań 'selektora' może być dla nich trudne, więc usuwam zduplikowany status, aby ludzie mogli aktualizować to pytanie. – Suragch

Odpowiedz

128

Od Swift 2.2, istnieje specjalna składnia dla kompilatora czasie sprawdzane selektorów. Używa składni: #selector(methodName).

Swift 3 i później:

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

func sayHello(sender: UIBarButtonItem) { 
} 

Jeśli nie masz pewności, jaka jest nazwa metoda powinna wyglądać, istnieje specjalna wersja polecenia kopiowania, który jest bardzo pomocny. Umieścić kursor gdzieś w nazwie metody bazowej (np sayHello) i naciśnij Przesunięcie + Kontrola + Option + C. To powoduje, że "Nazwa symbolu" na klawiaturze zostanie wklejona. Jeśli również posiadasz Command, to skopiuje "Kwalifikowaną nazwę symbolu", która również będzie zawierać ten typ.

Swift 2.3:

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

func sayHello(sender: UIBarButtonItem) { 
} 

To dlatego, że imię parametr nie jest wymagany w Swift 2.3 przy nawiązywaniu połączenia metody.

Możesz dowiedzieć się więcej na temat składni na swift.org tutaj: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors

+10

Wystarczy wspomnieć, że funkcja działania nie może być ** prywatna **!Nie jestem do końca pewien, dlaczego, ale zawsze dostaję błąd, gdybym podał nazwę jakiejś prywatnej funkcji – maddob

+0

Mam to: "nie implementuje methodSignatureForSelector" – AlamoPS

+1

@AlamoPS Jeśli używasz drugiej wersji z dwukropkiem, Będziesz musiał upewnić się, że typy parametrów funkcji są zgodne z tymi, które obsługują. – Jason

Powiązane problemy