Le nouveau Xcode 7.3 passant le paramètre via addTarget fonctionne généralement pour moi, mais dans ce cas, il jette l'erreur dans le titre. Des idées? Il en jette un autre quand j'essaye de le changer en @objc
Je vous remercie!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Le sélecteur qu'il appelle
func didTapCommentButton(post: Post) {
}
@objc
ou est-ce une sous-classe deNSObject
?Réponses:
Dans mon cas, la fonction du sélecteur était
private
. Une fois que j'ai suppriméprivate
l'erreur, l'erreur avait disparu. Il en va de mêmefileprivate
.Dans Swift 4,
vous devrez ajouter
@objc
à la déclaration de fonction. Jusqu'à Swift 4, cela était implicitement déduit.la source
fileprivate
.fileprivate
est-ce que cela sera résolu?private
nifileprivate
ne fonctionneraVous devez utiliser l'
@objc
attribut surdidTapCommentButton(_:)
pour l'utiliser avec#selector
.Vous dites que vous avez fait cela, mais vous avez une autre erreur. Je suppose que la nouvelle erreur est que ce
Post
n'est pas un type compatible avec Objective-C. Vous ne pouvez exposer une méthode à Objective-C que si tous ses types d'argument et son type de retour sont compatibles avec Objective-C.Vous pouvez résoudre ce problème en créant
Post
une sous-classe deNSObject
, mais cela n'a pas d'importance, car l'argument dedidTapCommentButton(_:)
ne sera pas un dePost
toute façon. L'argument d'une fonction d'action est l' expéditeur de l'action, et cet expéditeur le seracommentButton
, ce qui est vraisemblablement unUIButton
. Vous devez déclarerdidTapCommentButton
comme ceci:Vous serez alors confronté au problème d'obtenir le
Post
correspondant au bouton tapé. Il existe plusieurs façons de l'obtenir. En voici une.Je suppose (puisque votre code l'indique
cell.commentButton
) que vous configurez une vue de table (ou une vue de collection). Et comme votre cellule a une propriété non standard nomméecommentButton
, je suppose que c'est uneUITableViewCell
sous-classe personnalisée . Supposons donc que votre cellule soitPostCell
déclarée comme ceci:Ensuite, vous pouvez remonter la hiérarchie des vues à partir du bouton pour trouver le
PostCell
, et en obtenir le message:la source
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
Essayez de faire pointer le sélecteur sur une fonction wrapper, qui à son tour appelle votre fonction déléguée. Cela a fonctionné pour moi.
-
la source
Comme vous le savez,
selector
[About] indique que leObjective-C
runtime doit être utilisé. Déclarations marquéesprivate
oufileprivate
non exposées au runtime Objective-C par défaut . C'est pourquoi vous avez deux variantes:private
oufileprivate
par@objc
[À propos]internal
,public
,open
modificateur d'accès [ A propos]la source