Sie müssen das verwenden @objc
Attribut 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 Post
es 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 Post
eine Unterklasse aus erstellen NSObject
, aber das spielt keine Rolle, da das Argument dafür sowieso didTapCommentButton(_:)
kein sein Post
wird. Das Argument für eine Aktionsfunktion ist der Absender der Aktion, und dieser Absender wird sein commentButton
, was vermutlich a ist UIButton
. Sie sollten didTapCommentButton
wie folgt deklarieren :
@objc func didTapCommentButton(sender: UIButton) {
// ...
}
Sie haben dann das Problem, die Post
entsprechende 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 UITableViewCell
Unterklasse handelt. Nehmen wir also an, Ihre Zelle ist PostCell
wie 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
}