Вам нужно использовать @objcатрибут on, didTapCommentButton(_:)чтобы использовать его #selector.
Вы говорите, что сделали это, но получили еще одну ошибку. Я предполагаю, что новая ошибка заключается в том, что Postтип ошибки не совместим с Objective-C. Вы можете предоставить метод Objective-C только в том случае, если все его типы аргументов и его возвращаемый тип совместимы с Objective-C.
Вы можете исправить это, создав Postподкласс NSObject, но это не имеет значения, потому что аргумент to didTapCommentButton(_:)в Postлюбом случае не будет . Аргументом функции действия является отправитель действия, и этим отправителем будет commentButton, предположительно, объект UIButton. Вы должны объявить didTapCommentButtonтак:
@objc func didTapCommentButton(sender: UIButton) {
// ...
}
Затем вы столкнетесь с проблемой получения Postсоответствующей нажатой кнопки. Есть несколько способов получить его. Вот один.
Я так понимаю (поскольку ваш код говорит cell.commentButton), что вы настраиваете табличное представление (или представление коллекции). И поскольку ваша ячейка имеет нестандартное свойство с именем commentButton, я предполагаю, что это настраиваемый UITableViewCellподкласс. Итак, предположим, что ваша ячейка PostCellобъявлена так:
class PostCell: UITableViewCell {
@IBOutlet var commentButton: UIButton?
var post: Post?
// other stuff...
}
Затем вы можете пройти вверх по иерархии представлений с помощью кнопки, чтобы найти PostCellи получить сообщение из него:
@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
}