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 #] не было!

Было бы здорово, если бы кто-нибудь мог дать ясность или объяснение этому - иначе - я надеюсь, что это сэкономит кому-то еще несколько часов работы!