Objective-Cで記述されたSwift 3 UIButton
サブクラスにサブクラス化しました。
ターゲットを追加しようとすると、エラーコードで失敗します。
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
としてfuncをマークすることであり、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
にすることもできます
問題は、#selector(self.action())
で、self.action()
がメソッド呼び出しであることです。 callメソッドは必要ありません。 nameメソッドにしたい。代わりに#selector(action)
と言ってください:括弧を失い、さらにself
は必要ありません。
別の回答のコメントから追加されました: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
}
これの代替コーディング、View Controllerで「action()」メソッドを維持しながら、ボタンに「only」「addTarget」を移動:
self.addTarget(superview?, action(superview?.MyAction), for: .touchUpInside)
「MyAction()」メソッドをスーパービューに移動することを検討するように求めているのはなぜですか?二重:
self.action()
と言う代わりに、ActionButton.action()
を使用します。
追加の関数を追加してもかまわない場合は、関数をネストできます。
self.addTarget(self, action: myAction, for: UIControlledEvent)
myAction(){
@obj.methodYouWantToCall(//parameters//)
}