IPad popover textfield - resignFirstResponder не отменяет клавиатуру
У меня есть два текстовых поля: электронная почта и пароль. Следующий код отлично работает, когда поля отображаются на обычном представлении, но когда они находятся на popover, resignFirstResponder не работает (работает startFirstPender). textFieldsShouldReturn был вызван для обоих полей.
Любая идея, если я что-то упускаю?
Спасибо!
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == email) {
[password becomeFirstResponder];
return NO;
}
[theTextField resignFirstResponder];
return NO;
}
Ответы
Ответ 1
Отметьте этот вопрос:
Переопределение disablesAutomaticKeyboardDismissal
для возврата NO
, как показано ниже, той же самой проблемы. Вы должны поместить этот код в свой контроллер просмотра, из которого вы инициируете клавиатуру:
- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}
Ответ 2
Как описано в этом ответе, клавиатура иногда остается на экране, когда представление представлено стилем UIModalPresentationFormSheet.
Ответ 3
Я не слишком уверен в этом, но, поскольку я понимаю иерархию ответчика, отставка будет работать только в том случае, если у вас есть другой ответчик, чтобы ответить.
В обычном представлении сам вид готов. Во всплывающем меню, возможно, вам нужно что-то сделать для своего всплывающего класса (например, переопределить некоторые методы Responder), чтобы это работало.
Ответ 4
У меня также была эта проблема. Но я решил это, сделав еще один элемент управления, который не находится в popover как firstResponder
, а затем ушел от него. Но я не в чем проблема с popover.
Ответ 5
Ответ предоставляется как возможное решение для других с аналогичной проблемой, но где обычные средства защиты не работают.
Вкратце -
У меня была аналогичная проблема (при определенном условии) и все проделано - безрезультатно. В моем списке возможных решений был [obj resignFirstResponder], переопределение "disablesAutomaticKeyboardDismissal" для моего view, [self.view endEditing: YES]; и множество других вещей.
Пошел об определении [id] текущего первого ответчика, только чтобы обнаружить, что это было ноль. Нажатие "Готово" на клавиатуре или использование любого из вышеперечисленных методов ничего не сделало - клавиатура осталась - даже после нажатия на другое поле ввода.
Экран по существу был ViewController с UITableView с полем ввода текста в каждой ячейке - всего 7 или 8. Нажатие на любую ячейку вызовет клавиатуру, как ожидалось, и нажатие отдельной кнопки "Далее" (чтобы скрыть клавиатуру и другую обработку) работало, как ожидалось.
Однако в ландшафтном режиме последнее поле было закрыто клавиатурой, требующей прокрутки таблицы, чтобы показать это.
После прокрутки и нажатия на последнее поле ввода клавиатура не может быть отклонена - несмотря ни на что. Единственная работа вокруг - прокрутить таблицу под клавиатурой, а затем нажать кнопку "Далее". Это не имеет смысла.
Почти в момент отказа (и реализации обходного пути) решение, которое сработало, состояло в том, чтобы сделать последнее поле ввода первымResponder (даже если оно уже было мигающим курсором), а затем после этого resignFirstResponder.
Так
`- (void) actionNext {
[[m_arrInputFields objectAtIndex:7] becomeFirstResponder];
[[m_arrInputFields objectAtIndex:7] resignFirstResponder];
} `
исправлена проблема, тогда как [m_arrInputFields objectAtIndex: #any other index #] не было!
Было бы здорово, если бы кто-нибудь мог дать ясность или объяснение этому - иначе - я надеюсь, что это сэкономит кому-то еще несколько часов работы!