Vous devez utiliser l' @objc
attribut sur didTapCommentButton(_:)
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 de NSObject
, mais cela n'a pas d'importance, car l'argument de didTapCommentButton(_:)
ne sera pas un de Post
toute façon. L'argument d'une fonction d'action est l' expéditeur de l'action, et cet expéditeur le sera commentButton
, ce qui est vraisemblablement un UIButton
. Vous devez déclarer didTapCommentButton
comme ceci:
@objc func didTapCommentButton(sender: UIButton) {
// ...
}
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ée commentButton
, je suppose que c'est une UITableViewCell
sous-classe personnalisée . Supposons donc que votre cellule soit PostCell
déclarée comme ceci:
class PostCell: UITableViewCell {
@IBOutlet var commentButton: UIButton?
var post: Post?
// other stuff...
}
Ensuite, vous pouvez remonter la hiérarchie des vues à partir du bouton pour trouver le PostCell
, et en obtenir le message:
@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
}