87 votes

' #selector ' se réfère à une méthode qui n’est pas exposée à l’Objective-C

<p>Le nouveau 7.3 Xcode en passant le paramètre via addTarget généralement fonctionne pour moi, mais dans ce cas il jette l’erreur dans le titre. Toutes les idées ? Il lève un autre quand j’essaye de le changer pour @objc<p>Merci !</p><pre><code></code></pre><p>Il appelle le sélecteur</p><pre><code></code></pre></p>

141voto

Shaked Sayag Points 3246
<p>Dans mon cas, la fonction du sélecteur était <code></code> . Une fois que j’ai enlevé le <code></code> l’erreur a disparu. Il en va de même <code></code> .<p><strong>Dans Swift 4</strong><br>Vous devez ajouter <code></code> à la déclaration de fonction. Jusqu'à 4 rapide c’était implicitement déduite.</p></p>

51voto

rob mayoff Points 124153

Vous devez utiliser l' @objc attribut didTapCommentButton(_:) à l'utiliser avec d' #selector.

Vous dites que vous avez fait, mais vous avez une autre erreur. Ma conjecture est que le nouveau message d'erreur est qu' Post n'est pas un type qui est compatible avec Objective-C. Vous ne pouvez exposer une méthode Objective-C si tous ses types d'argument, et son type de retour, sont compatibles avec l'Objective-C.

Vous avez pu le résoudre qu'en faisant de l' Post une sous-classe de NSObject, mais cela ne va pas à la matière, parce que l'argument d' didTapCommentButton(_:) ne sera pas un Post de toute façon. L'argument à une fonction action est l' expéditeur de l'action, et que l'expéditeur sera commentButton, ce qui est probablement un UIButton. Vous devez déclarer didTapCommentButton comme ceci:

@objc func didTapCommentButton(sender: UIButton) {
    // ...
}

Vous serez alors confrontés au problème de l'obtention de l' Post correspondant à la taraudés bouton. Il existe de multiples façons de l'obtenir. En voici une.

Je collecte (depuis votre code, dit - cell.commentButton) que vous êtes en train de configurer une vue de table (ou vue d'une collection). Et depuis votre cellule a une non-standard de la propriété nommée commentButton, je suppose que c'est une coutume UITableViewCell sous-classe. Supposons donc votre cellule, est une PostCell déclaré comme ceci:

class PostCell: UITableViewCell {
    @IBOutlet var commentButton: UIButton?
    var post: Post?

    // other stuff...
}

Ensuite, vous pouvez marcher jusqu'à la vue de la hiérarchie à partir du bouton de trouver l' PostCell, et d'obtenir le poste de:

@objc func didTapCommentButton(sender: UIButton) {
    var ancestor = sender.superview
    while ancestor != nil && !(ancestor! is PostCell) {
        ancestor = view.superview
    }
    guard let cell = ancestor as? PostCell,
        post = cell.post
        else { return }

    // Do something with post here
}

9voto

pfj Points 189
<p>Essayez d’avoir le sélecteur de pointer vers une fonction wrapper qui appelle votre fonction de délégué. Cela a fonctionné pour moi.<pre><code></code></pre><p>-</p><pre><code></code></pre></p>

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: