Новый Xcode 7.3, передающий параметр через addTarget, обычно у меня работает, но в этом случае он выдает ошибку в заголовке. Любые идеи? Выдает другое, когда я пытаюсь изменить его на @objc
Спасибо!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Селектор, который он вызывает
func didTapCommentButton(post: Post) {
}
@objc
или является его подклассомNSObject
?Ответы:
В моем случае функция селектора была
private
. Как только я удалилprivate
ошибку, ошибка исчезла. То же самое и сfileprivate
.В Swift 4
вам нужно будет добавить
@objc
в объявление функции. До Swift 4 это предполагалось неявно.источник
fileprivate
.fileprivate
решится ли?private
ниfileprivate
не будет работатьВам нужно использовать
@objc
атрибут on,didTapCommentButton(_:)
чтобы использовать его#selector
.Вы говорите, что сделали это, но получили еще одну ошибку. Я предполагаю, что новая ошибка заключается в том, что
Post
тип ошибки не совместим с Objective-C. Вы можете предоставить метод Objective-C только в том случае, если все его типы аргументов и его возвращаемый тип совместимы с Objective-C.Вы можете исправить это, создав
Post
подклассNSObject
, но это не имеет значения, потому что аргумент todidTapCommentButton(_:)
вPost
любом случае не будет . Аргументом функции действия является отправитель действия, и этим отправителем будетcommentButton
, предположительно, объектUIButton
. Вы должны объявитьdidTapCommentButton
так:Затем вы столкнетесь с проблемой получения
Post
соответствующей нажатой кнопки. Есть несколько способов получить его. Вот один.Я так понимаю (поскольку ваш код говорит
cell.commentButton
), что вы настраиваете табличное представление (или представление коллекции). И поскольку ваша ячейка имеет нестандартное свойство с именемcommentButton
, я предполагаю, что это настраиваемыйUITableViewCell
подкласс. Итак, предположим, что ваша ячейкаPostCell
объявлена так:Затем вы можете пройти вверх по иерархии представлений с помощью кнопки, чтобы найти
PostCell
и получить сообщение из него:источник
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
Попробуйте указать селектором на функцию-оболочку, которая, в свою очередь, вызывает функцию вашего делегата. Это сработало для меня.
-
источник
Как вы знаете, в
selector
[About] сказано, чтоObjective-C
следует использовать среду выполнения. Объявления, помеченные какprivate
илиfileprivate
не представляемые среде выполнения Objective-C по умолчанию . Поэтому у вас есть два варианта:private
или [О]fileprivate
@objc
internal
,public
,open
модификатор доступа [О]источник