プログラムでビューにUITapGestureRecognizerを追加しています:
let gesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(modelObj:myModelObj)))
self.imageView.addGestureRecognizer(gesture)
func handleTap(modelObj: Model) {
// Doing stuff with model object here
}
最初に遭遇した問題は quot;'#selector'の引数が '@Objc'メソッド、プロパティ、またはイニシャライザを参照していないというものでした。
そこで、handleTapのシグネチャに@objcを追加した:
@objc func handleTap(modelObj: Model) {
// Doing stuff with model object here
}
パラメーターの型がObjective-Cで表現できないので、メソッドに@objcを付けることはできません。
Objective-Cではパラメータの型を表すことができないため、メソッドに@objcを指定することはできません。ユーザーがこれらのピンの1つをタップしたときに、どの注目点をタップしたかを知りたいのです。私はこのモデルオブジェクトを使ってピン画像に地図上の座標を与えているので、このオブジェクトをジェスチャーハンドラに送るだけなら簡単だと思いました。
あなたはいくつかのことを誤解しているようだ。
target/action]1を使用する場合、関数のシグネチャは特定の形式でなければなりません。
func doSomething(sender: Any)
または
func doSomething(sender: Any, forEvent event: UIEvent)
ここで...
sender` パラメータはアクションメッセージを送信するコントロールオブジェクトです。
あなたの場合、送信者は UITapGestureRecognizer
です。
また、#selector()
はfuncシグネチャを含むべきで、渡されたパラメータは含まない。つまり
func handleTap(sender: UIGestureRecognizer) {
}
の場合は
let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
func とジェスチャがビューコントローラ内にあり、 modelObj
がプロパティ / ivar であると仮定すると、ジェスチャレコグナイザと一緒に渡す必要はありません。
ステップ1:送信者のカスタムオブジェクトを作成する。
ステップ2:送信者のカスタム・オブジェクトに変更したいプロパティを追加する。
ステップ3:受信関数で送信者をカスタムオブジェクトにタイプキャストし、それらのプロパティにアクセスする。
例えば ボタンをクリックすると、文字列やカスタムオブジェクトを送信します。
ステップ1
class CustomButton : UIButton {
var name : String = ""
var customObject : Any? = nil
var customObject2 : Any? = nil
convenience init(name: String, object: Any) {
self.init()
self.name = name
self.customObject = object
}
}
step 2-a: ストーリーボードにもカスタムクラスを設定します。
ステップ2-b:次のようにカスタムクラスでそのボタンのIBOutletを作成します。
@IBOutlet weak var btnFullRemote: CustomButton!
step 3: senderのカスタムオブジェクトに、変更したいプロパティを追加します。
btnFullRemote.name = "Nik"
btnFullRemote.customObject = customObject
btnFullRemote.customObject2 = customObject2
btnFullRemote.addTarget(self, action: #selector(self.btnFullRemote(_:)), for: .touchUpInside)
ステップ4:受信関数で送信者をカスタム・オブジェクトにタイプキャストし、それらのプロパティにアクセスする。
@objc public func btnFullRemote(_ sender: Any) {
var name : String = (sender as! CustomButton).name as? String
var customObject : customObject = (sender as! CustomButton).customObject as? customObject
var customObject2 : customObject2 = (sender as! CustomButton).customObject2 as? customObject2
}