Sie müssen das verwenden @objcAttribut auf , didTapCommentButton(_:)es zu benutzen mit #selector.
Sie sagen, Sie haben das getan, aber Sie haben einen weiteren Fehler erhalten. Ich vermute, dass der neue Fehler darin besteht, dass Postes sich nicht um einen Typ handelt, der mit Objective-C kompatibel ist. Sie können eine Methode nur dann für Objective-C verfügbar machen, wenn alle Argumenttypen und der Rückgabetyp mit Objective-C kompatibel sind.
Sie könnten das beheben, indem Sie Posteine Unterklasse aus erstellen NSObject, aber das spielt keine Rolle, da das Argument dafür sowieso didTapCommentButton(_:)kein sein Postwird. Das Argument für eine Aktionsfunktion ist der Absender der Aktion, und dieser Absender wird sein commentButton, was vermutlich a ist UIButton. Sie sollten didTapCommentButtonwie folgt deklarieren :
@objc func didTapCommentButton(sender: UIButton) {
// ...
}
Sie haben dann das Problem, die Postentsprechende Schaltfläche zu erhalten. Es gibt mehrere Möglichkeiten, um es zu bekommen. Hier ist eine.
Ich erfahre (da Ihr Code sagt cell.commentButton), dass Sie eine Tabellenansicht (oder eine Sammlungsansicht) einrichten. Und da Ihre Zelle eine nicht standardmäßige Eigenschaft mit dem Namen hat commentButton, gehe ich davon aus, dass es sich um eine benutzerdefinierte UITableViewCellUnterklasse handelt. Nehmen wir also an, Ihre Zelle ist PostCellwie folgt deklariert:
class PostCell: UITableViewCell {
@IBOutlet var commentButton: UIButton?
var post: Post?
// other stuff...
}
Dann können Sie die Ansichtshierarchie über die Schaltfläche nach oben gehen, um die zu finden PostCell, und den Beitrag daraus abrufen:
@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
}