1. ホーム
  2. ios

[解決済み] Swiftでセレクタに引数を渡す

2023-04-29 04:46:51

質問

プログラムでUITapGestureRecognizerをビューの1つに追加しています。

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
}

私が遭遇した最初の問題は "「#selector」の引数が「@Objc」メソッド、プロパティ、またはイニシャライザを参照していないことでした。

クールなので、handleTapのシグネチャに@objcを追加しました。

@objc func handleTap(modelObj: Model) {
  // Doing stuff with model object here
}

今、私はエラー "パラメータの型がObjective-Cで表現できないので、メソッドは@objcをマークすることができませんを取得しています。

これは、建物の地図のイメージで、興味のあるポイントの位置を示すいくつかのピン画像があるだけです。ユーザーがこれらのピンをタップしたときに、どの注目点をタップしたかを知りたいのですが、これらの注目点を記述したモデルオブジェクトを持っています。このモデルオブジェクトを使ってピン画像に地図上の座標を与えているので、このオブジェクトをジェスチャーハンドラに送信するだけなら簡単だと思いました。

解決方法

いくつか誤解があるようですね。

を使用する場合 ターゲット/アクション を使う場合、関数シグネチャは特定の形式を持たなければなりません...

func doSomething()

または

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 がプロパティ / アイバーである場合、ジェスチャー認識器と一緒に渡す必要はなく、単に handleTap