90 votes

Passage d'arguments au sélecteur en Swift

Je suis en train d'ajouter par programme un UITapGestureRecognizer à 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 référence à une méthode, une propriété ou un initialisateur '@Objc'.

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

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

Maintenant, j'obtiens l'erreur "Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C".

Il s'agit simplement d'une image du plan d'un bâtiment, avec quelques images d'épingles indiquant l'emplacement de points d'intérêt. Lorsque l'utilisateur touche l'une de ces épingles, j'aimerais savoir quel point d'intérêt il a touché, et j'ai un objet modèle qui décrit ces points d'intérêt. J'utilise cet objet modèle pour donner à l'image de l'épingle ses coordonnées sur la carte et je pensais qu'il aurait été facile pour moi de simplement envoyer l'objet au gestionnaire de gestes.

1 votes

Vous ne pouvez pas passer des valeurs à un sélecteur comme ça. Pourquoi ne pouvez-vous pas conserver cette valeur dans une variable d'instance et y accéder à partir de la méthode du sélecteur ?

4 votes

Duplicata possible de stackoverflow.com/questions/35635595/ .

-1voto

Chucky Points 98

C'est peut-être une pratique terrible mais j'ajoute simplement ce que je veux restaurer à

button.restorationIdentifier = urlString

y

@objc func openRelatedFact(_ sender: Any) {
        if let button = sender as? UIButton, let stringURL = factButton.restorationIdentifier, let url = URL(string: stringURL) {
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url, options: [:])
            }
        }

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X