У меня есть то, что я считал очень простым расширением протокола для моего UIViewController
, предоставляющего возможность отклонять клавиатуру с помощью жестов tap. Здесь мой код:
@objc protocol KeyboardDismissing {
func on(tap: UITapGestureRecognizer)
}
extension KeyboardDismissing where Self: UIViewController {
func addDismissalGesture() {
let tap = UITapGestureRecognizer(target: self, action: #selector(Self.on(tap:)))
view.addGestureRecognizer(tap)
}
func on(tap: UITapGestureRecognizer) {
dismissKeyboard()
}
func dismissKeyboard() {
view.endEditing(true)
}
}
Проблема в том, что приведенный выше код генерирует ошибку компиляции в этой строке:
let tap = UITapGestureRecognizer(target: self, action: #selector(Self.on(tap:)))
С сообщением об ошибке:
Аргумент '#selector' относится к методу экземпляра 'on (tap:)', который не подвергается Objective-C
с предложением "исправить", добавив @objc
до func on(tap: UITapGestureRecognizer)
Хорошо, я добавляю тег:
@objc func on(tap: UITapGestureRecognizer) {
dismissKeyboard()
}
Но затем он генерирует другую ошибку компиляции в этом недавно добавленном теге @objc
с сообщением об ошибке:
@objc может использоваться только с членами классов, протоколами @objc и конкретными расширениями классов
с предложением "исправить", удалив тот же самый тег, который мне просто сказали добавить.
Первоначально я думал добавить @objc
, прежде чем мое определение протокола решит любые проблемы #selector
, но, по-видимому, это не так, и эти циклические сообщения об ошибках/предложения нисколько не помогают. Я отправился на дикую охоту на гусей, добавляя/удаляя теги @objc
всюду, методы маркировки как optional
, вводя методы в определение протокола и т.д.
Также не имеет значения, что я ввел в определение протокола. Оставляя расширение одинаковым, следующий пример не работает и не сочетает объявленные методы в определении протокола:
@objc protocol KeyboardDismissing {
func on(tap: UITapGestureRecognizer)
}
Это заставляет меня думать, что он работает, компилируя в качестве автономного протокола, но второй я пытаюсь добавить его в контроллер представления:
class ViewController: UIViewController, KeyboardDismissing {}
он отбрасывает исходную ошибку.
Может кто-нибудь объяснить, что я делаю неправильно, и как я могу скомпилировать это?
Примечание:
Я рассмотрел этот вопрос, но для Swift 2.2 не Swift 3 и компиляция ответа сразу после создания класса контроллера вида, который наследуется от протокол, определенный в примере.
Я также рассмотрел этот вопрос, но ответ использует NotificationCenter
, который не является тем, что я после.
Если есть какие-то другие, казалось бы, повторяющиеся вопросы, пожалуйста, дайте мне знать.