1. ホーム
  2. ios

[解決済み] SwiftでUIBarButtonItemにアクションを設定する方法

2023-02-19 19:40:54

質問

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() はインテリセンスに表示されますが、動作しません。

お世話になります。

EDIT: 後学のために、以下のように動作します。

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) {
}

メソッド名がどのようなものであるべきかがわからない場合、非常に便利な特別バージョンのコピーコマンドがあります。カーソルをベースメソッド名 (例: sayHello) のどこかに移動して シフト + コントロール + オプション + C . これでキーボードに「記号名」が貼り付けられるようになります。さらに コマンド を押すと、「修飾されたシンボル名」がコピーされ、型も含まれるようになります。

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