Я работаю над формой, которая содержит несколько UITextField
экземпляров, и мне нужно вызвать побочный эффект (то есть представить предупреждение), когда одно конкретное текстовое поле, чей метод делегата textFieldShouldBeginEditing(_:)
всегда возвращает false
, являетсяselected.
Существующая реализация этой функции вызвала этот побочный эффект в методе делегата textFieldShouldBeginEditing(_:)
. Это вызывало проблемы на iPad Pro, потому что когда пользователь нажимает клавишу Tab на экранной клавиатуре, этот метод вызывается не только для следующего респондента, но и для всех текстовых полей в форме, что приводит к побочному эффектубыть запущенным в неподходящее время.
Прочитав этот связанный вопрос , я попытался зарегистрировать свой контроллер представления для UIKeyCommands, как в этом упрощенном примере, чтобы явно обрабатывать нажатия клавиш Tab:
override func viewDidLoad() {
super.viewDidLoad()
for textField in [textField1, textField2, textField3] {
textField?.delegate = self
}
let keyCommand = UIKeyCommand(input: "\t", modifierFlags: [], action: #selector(didPressTabKey(sender:)))
self.addKeyCommand(keyCommand)
}
@objc func didPressTabKey(sender: UIKeyCommand) {
NSLog("Did press tab key")
}
К сожалению, действие UIKeyCommand
вызывается только при нажатии клавиши Tab на внешней клавиатуре (то есть клавиатуре Mac при работе на симуляторе) и никогда не срабатывает при использовании iPad Pro. экранная клавиатура (на симуляторе и реальных устройствах).
Очевидный способ обойти эту проблему - переместить побочный эффект от textFieldShouldBeginEditing(_:)
в textFieldDidBeginEditing(_:)
, но, учитывая, что мне нужно вызватьэто когда textFieldShouldBeginEditing(_:)
возвращает false
, этот подход не является удовлетворительным.
Текущий обходной путь, который я реализуюd - убрать побочный эффект из textFieldShouldBeginEditing(_:)
и явно прослушивать нажатия на UITextField
. При таком подходе побочный эффект корректно срабатывает, когда пользователь выбирает это конкретное текстовое поле, но нет способа вызвать его, когда пользователь нажимает клавишу Tab при редактировании предыдущего поля в порядке табуляции формы.
Есть ли способ перехватить нажатие клавиши Tab на экранной клавиатуре?