Нежелательная клавиатура после обратной навигации
Все UIViewController
S в моем приложении управляются на верхнем уровне UINavigationController
, в UIViewController
что в настоящее время на вершине моего стека навигации у меня есть набор UITextField
s.
Проблема возникает, когда я звоню becomeFirstResponder()
на одном из этих текстовых полей, а затем сразу же вернитесь назад, не меняя фокус сначала, например, нажав на другое поле. После перехода на один уровень назад появляется клавиатура, и я не нашел способа удержать ее от появления или исчезновения. Это даже остается, поскольку я далее выдвигаю представления стека навигации.
- Это прямо или косвенно связано с
becomeFirstResponder()
звоните, потому что без этого звонка проблема не возникает. - Даже если я в тестовых целях позвоню
resignFirstResponder()
незамедлительно послеbecomeFirstResponder()
клавиатура по-прежнему отображается после перехода назад.
Я пробовал другие способы, такие как обнаружение и отставка первого респондента или вызов endEditing()
в viewWillDisappear()
но не удалось. Я даже не уверен, к чему принадлежит эта клавиатура после того, как соответствующее представление выскочило из стека. Я не могу проверить клавиатуру в View Debugger, поскольку она там не отображается.
Почему появляется клавиатура и как я могу ее предотвратить?
2 ответа
Оказывается, что проверка формы, которая захватила первого респондента, продолжала требовать его, пока содержание поля не было действительным. Если он не сбрасывает статус до обратной навигации, клавиатура остается, и становится трудно назначить первого респондента другому элементу управления.
В моем случае решение состояло в том, чтобы более тщательно отслеживать, какое поле является первым респондентом, обнаружить нажатие кнопки "назад", в этом случае разрешить безоговорочную отставку первого респондента, а затем отправить в отставку первого респондента для этого поля.
var currentTextField: UITextField?
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
if let currentField = self.currentTextField {
currentField.resignFirstResponder()
}
}
override public func willMoveToParentViewController(parent: UIViewController?) {
if (parent == nil) {
backButtonPushed = true
}
super.willMoveToParentViewController(parent)
}
func customTextFieldDidBeginEditing(textField: UITextField) {
currentTextField = textField
}
public func textFieldShouldEndEditing(textField: UITextField) -> Bool {
// ...
// Must return true if back button is pushed.
if backButtonPushed {
return true
} else {
// ...
}
}
Вы пытались вызвать endEditing() в viewWillAppear() нового VC вместо этого?