Passer des arguments au sélecteur dans Swift3

J'ajoute un UITapGestureRecognizer par programme à l'une de mes vues:

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 } 

Le premier problème que j'ai rencontré était "L'argument de '#selector' ne fait pas reference à une méthode, une propriété ou un initialiseur '@Objc'.

Cool, j'ai donc ajouté @objc à la signature handleTap:

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

Maintenant, j'obtiens l'erreur "La méthode ne peut pas être marquée @objc car le type du paramètre ne peut pas être représenté en Objective-C.

C'est juste une image de la carte d'un bâtiment, avec des images d'épingles indiquant l'location des points d'intérêt. Lorsque l'user appuie sur l'une de ces broches, je voudrais savoir quel point d'intérêt ils ont tapé, et j'ai un object model qui décrit ces points d'intérêt. J'utilise cet object model pour donner à l'image de l'épingle ses coordonnées sur la carte, donc j'ai pensé qu'il m'aurait été facile de simplement envoyer l'object au gestionnaire de gestes.

On dirait que vous vous méprenez sur un certain nombre de choses.

Lors de l'utilisation de target / action , la signature de la fonction doit avoir une certaine forme …

 func doSomething(sender: Any) 

ou

 func doSomething(sender: Any, forEvent event: UIEvent) 

où…

Le paramètre sender est l'object de contrôle qui envoie le message d'action.

Dans votre cas, l'expéditeur est le UITapGestureRecognizer

En outre, #selector() devrait contenir la signature func, et n'inclut PAS les parameters passés. Donc pour…

 func handleTap(sender: UIGestureRecognizer) { } 

tu aurais dû…

 let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 

En supposant que le func et le geste sont dans un controller de vue, dont modelObj est une propriété / ivar, il n'est pas nécessaire de le passer avec le reconnaissance de mouvement, vous pouvez juste y faire reference dans handleTap

Je pense que vous devriez créer une méthode @objc qui appelle handleTap(modelObj:myModelObj) .

 @objc func someMethod() { // name this properly! handleTap(modelObj: myModelObj) } 

Ensuite, vous pouvez passer cela comme un sélecteur:

 #selector(someMethod)