web-dev-qa-db-ja.com

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")
73
kmiklas

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

139
drewag

Swift 4の例

button.action = #selector(buttonClicked(sender:))

@objc func buttonClicked(sender: UIBarButtonItem) {

}
22
norbDEV

Swift 4では、アクションメソッドの前に@objcを追加する必要があります。

次の例を参照してください。

self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Select", target: self, action: #selector(selectAction(_:)))

 @objc func selectAction(_ sender:UIBarButtonItem) -> Void {
    print("Select Clicked")
}
0
Shahul Hasan