Vous devez utiliser le @objc
l'attribut didTapCommentButton(_:)
pour l'utiliser avec #selector
.
Vous dites que vous l'avez fait mais que vous avez eu une autre erreur. A mon avis, la nouvelle erreur est que Post
n'est pas un type qui est compatible avec l'Objective-C. Vous ne pouvez exposer une méthode à l'Objective-C que si tous ses types d'arguments, ainsi que son type de retour, sont compatibles avec l'Objective-C.
Vous pouvez corriger cela en faisant Post
une sous-classe de NSObject
mais ça n'a pas d'importance, parce que l'argument pour didTapCommentButton(_:)
ne sera pas un Post
de toute façon. L'argument d'une fonction d'action est le expéditeur de l'action, et cet expéditeur sera commentButton
qui est vraisemblablement un UIButton
. Vous devez déclarer didTapCommentButton
comme ça :
@objc func didTapCommentButton(sender: UIButton) {
// ...
}
Vous serez alors confronté au problème de l'obtention de la Post
correspondant à la touche touchée. Il y a plusieurs façons de l'obtenir. En voici une.
Je suppose (puisque votre code dit cell.commentButton
) que vous êtes en train de configurer une vue de table (ou une vue de collection). Et puisque votre cellule possède une propriété non standard nommée commentButton
je suppose que c'est une coutume UITableViewCell
sous-classe. Donc, supposons que votre cellule est un PostCell
déclaré comme ça :
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 bouton PostCell
et d'en tirer 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
}
3 votes
À quoi ressemble la ligne de déclaration de classe de FeedViewController ? Comment est déclaré didTapCommentButton ? Quelle erreur obtenez-vous lorsque vous ajoutez @objc ?
1 votes
Mise à jour, j'ai modifié mon message. Je suis loin de l'ordinateur sur lequel il est installé en ce moment et j'ai oublié le message d'erreur exact, mais il s'agissait d'une de ces situations où XCode me dit de l'ajouter puis lance une erreur de sa propre décision.
2 votes
Votre classe déclare-t-elle
@objc
ou est-ce une sous-classe deNSObject
?2 votes
Pouvez-vous essayer d'enlever les parenthèses ? C'est inhabituel étant donné qu'il ne faut pas appeler une fonction dans un sélecteur.
0 votes
Cela a résolu mon problème en une seconde http://stackoverflow.com/a/36963058/1685165