Objective-Cで書かれているUIButton
のサブクラスをSwift 3でサブキャスしました。
ターゲットを追加しようとすると、エラーコードで失敗します。
class ActionButton: JTImageButton {
func action() {
}
func configure()) {
// ...
self.addTarget(self, action: #selector(self.action()), for: .touchUpInside)
// error:
// Argument of '#selector' does not refer to an '@objc' method, property, or initializer
}
}
ファンクを @objc
としてマークするだけで、self
参照や括弧は必要ありません。
class ActionButton: JTImageButton {
@objc func btnAction() {
}
func configure() {
// ...
self.addTarget(self, action: #selector(btnAction), for: .touchUpInside)
// error:
// Argument of '#selector' does not refer to an '@objc' method, property, or initializer
}
}
お望みなら private
にすることもできます。
他の回答のコメントから追加しました。func action()は、関数名とアクションの選択が悪いだけでなく、ビルドにも失敗します。(ただし、入力関数のパラメータとして使用することは可能で、私はこれらを設定するinit()にtarget/actionを渡すときにわかりやすくするためにそうしています)。私はわかりやすくするために、これを MyAction() と置き換えています。
これを試してみてください。
self.addTarget(self, action: #selector(MyAction), for: .touchUpInside)
とはいえ、MyAction()関数をボタンのスーパービューに移動させる方が、基本的なMVCデザインに沿ったものになるので、より良いデザインだと思います。
スーパービュー。
let myButton = ActionButton()
// include other button setup here
myButton.addTarget(self, action: #selector(MyAction), for: .touchUpInside
func action(_ sender: ActionButton) {
// code against button tap here
}
この場合の代替コーディングは、"action()"メソッドをビューコントローラに残し、"addTarget"のみ**ボタンに移動します。
self.addTarget(superview?, action(superview?.MyAction), for: .touchUpInside)
なぜ私は、"MyAction()"メソッドをスーパービューに移すことを検討してほしいと言っているのでしょうか?2つあります。