2014-07-08 26 views
57

如何設置Swift中的自定義UIBarButtonItem動作?如何在Swift中設置UIBarButtonItem的動作

下面的代碼成功放置按鈕,導航欄:

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

現在,我想打電話給func sayHello() { println("Hello") }當按鈕被觸摸。我的努力迄今:

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

和..

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

和..

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

注意sayHello()出現在智能感知,但不起作用。

感謝您的幫助。

編輯:爲子孫後代,以下工作:

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

您只是把選擇的字符串傳遞選擇在迅速,'行動:「sayHello的」' – Jiaaro

+0

太謝謝你了。我承受壓力要解決這個問題,並且感到沮喪。 – kmiklas

+1

此問題以前被標記爲[@selector()在Swift中的重複?](http://stackoverflow.com/questions/24007650/selector-in-swift)。但是,這個問題具體詢問'UIBarButtonItem',而另一個則沒有。要求初學者概括'selector'的所有用法對他們來說可能是困難的,所以我刪除了重複的狀態,以便人們可以隨時更新這個問題。 – Suragch

回答

128

由於雨燕2.2的,有一個編譯器時的特殊語法檢查選擇。它使用語法:#selector(methodName)

斯威夫特3和更高:

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

func sayHello(sender: UIBarButtonItem) { 
} 

如果您不確定方法名稱應該是什麼樣子,有複製命令,這是非常有用的一個特殊版本。將光標在某處基方法名稱(例如sayHello的),然後按 + 控制 + 選項 + Ç。這會讓您的鍵盤上的'符號名稱'被粘貼。如果您也持有命令它將複製'合格的符號名稱',其中將包括類型。

SWIFT 2.3:

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

func sayHello(sender: UIBarButtonItem) { 
} 

這是因爲製造方法調用當未在SWIFT 2.3所需要的第一參數名稱。

您可以瞭解更多有關語法上swift.org這裏:https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors

+10

只是要提到的動作函數不能**私人**!我不知道爲什麼,但我總是會遇到一個錯誤,因爲我提供了一些私人函數的名稱 – maddob

+0

我得到了這個:「沒有實現methodSignatureForSelector」 – AlamoPS

+1

@AlamoPS如果你使用冒號的第二個版本,你需要確保函數參數類型與您正在處理的任何操作相匹配。 – Jason

相關問題