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")
Swift 2.2の時点では、コンパイラーでチェックされるセレクターのための特別な構文があります。構文:#selector(methodName)
を使用します。
Swift 3以降:
var b = UIBarButtonItem(
title: "Continue",
style: .plain,
target: self,
action: #selector(sayHello(sender:))
)
func sayHello(sender: UIBarButtonItem) {
}
メソッド名がどのように見えるかわからない場合は、非常に役立つcopyコマンドの特別なバージョンがあります。基本メソッド名(sayHelloなど)のどこかにカーソルを置き、<Enter>を押します Shift+Control+Option+C。これにより、キーボードに「シンボル名」が貼り付けられます。あなたも持っているなら Command タイプも含まれる「修飾されたシンボル名」がコピーされます。
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
Swift 4の例
button.action = #selector(buttonClicked(sender:))
@objc func buttonClicked(sender: UIBarButtonItem) {
}
Swift 4では、アクションメソッドの前に@objcを追加する必要があります。
次の例を参照してください。
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Select", target: self, action: #selector(selectAction(_:)))
@objc func selectAction(_ sender:UIBarButtonItem) -> Void {
print("Select Clicked")
}