2014-07-08 17 views
57

Swift'de özel bir UIBarButtonItem eylemi nasıl ayarlanabilir?Swift'de bir UIBarButtonItem eylemi nasıl ayarlanır

Aşağıdaki kodu başarıyla gezinme çubuğunda bulunan düğmesine yerleştirir:

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

Şimdi, düğme dokunulduğunda func sayHello() { println("Hello") } çağırmak istiyorum. Benim çabaları şimdiye kadar:

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

ve ..

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

ve .. sayHello() intellisense görünür, ancak çalışmadığını

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

Not.

Yardımlarınız için teşekkürler.

DÜZENLEME: kuşaklar için aşağıdaki çalışır: Swift 2.2 itibariyle

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

sadece bir dizede seçici koyarak Swift içinde seçiciler geçmesi, 'eylemi: "sayHello"' – Jiaaro

+0

Çok teşekkür ederim. Bunu anlayabilmek için baskı altındayım ve hayal kırıklığına uğradım. – kmiklas

+1

Bu soru daha önce Swift'de [@selector()] kopyası olarak işaretlenmiştir (http://stackoverflow.com/questions/24007650/selector-in-swift). Ancak, bu soru özellikle UIBarButtonItem' ile ilgili olarak sorarken diğeri de sormaz. Yeni başlayanların 'selector'un tüm kullanımlarını genelleştirmesi zor olabilir, bu yüzden yinelenen durumu kaldırıyorum, böylece insanlar bu soruyu güncel tutabilirler. – Suragch

cevap

128

, seçiciler kontrol derleyici zamanı için özel bir sözdizimi vardır. Sözdizimi kullanır: #selector(methodName). Daha sonra 3 Swift ve

: yöntemin adını nasıl görünmesi gerektiği konusunda emin değilseniz

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

func sayHello(sender: UIBarButtonItem) { 
} 

, çok yararlıdır kopya komutunun özel bir sürümü var. Baz yöntemi adı (örneğin sayHello) bir yere imleci koyun ve Shift + Kontrol + Seçenek + C basın. Bu, klavyenizdeki "Simge İsmi" ni yapıştırır. Ayrıca, Komutu komutunu da tuttuğunuzda, türü de içeren "Nitelikli Sembol Adı" nı kopyalayacaktır. Swift 2.3

: bir yöntem çağrısı yaparken ilk parametre adı Swift 2.3 gerekli değildir, çünkü

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

func sayHello(sender: UIBarButtonItem) { 
} 

olmasıdır.

Burada swift.org üzerinde sözdizimi hakkında daha fazla bilgi edinebilirsiniz: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors

+10

Sadece eylem işlevinin ** özel olamayacağını belirtmek için **!Size Eğer iki nokta ile 2 sürümünü kullanıyorsanız – maddob

+0

adını sağlanan durumunda bir hata alıyorum İşlev parametre türlerinin, işlem yaptığınız her eylem için uygun olduğundan emin olmanız gerekir. – AlamoPS

+1

@AlamoPS "methodSignatureForSelector uygulamıyor": Neden gerçekten emin değilim, ama her zaman bu var bazı özel işlevi – Jason