beFirstResponder не учитывает настройки клавиатуры

Я работаю над довольно простым приложением для iPhone, чтобы решить квадратное уравнение, в основном потому, что это так просто — по крайней мере, концепции и математика!

Я создал интерфейс в Interface Builder, который имеет пару меток, 3 текстовых поля (varAfield и т. д.) и кнопку «Решить». 3 текстовых поля, которые установлены как UITextFieldDelegate, были настроены так, чтобы они автоматически отображали клавиатуру «Числа и пунктуация». Этот код используется для отключения клавиатуры, а затем автоматического перехода к следующей переменной, когда пользователь нажимает клавишу возврата (которая говорит «Далее», за исключением переменной C, которая говорит «Готово»

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == varAfield) {
    [varAfield resignFirstResponder];
    [varBfield becomeFirstResponder];
}
if (theTextField == varBfield) {
    [varBfield resignFirstResponder];
    [varCfield becomeFirstResponder];
}
if (theTextField == varCfield) {
    [varCfield  resignFirstResponder];
}
return YES;
}

Во всяком случае, проблема возникает с первым экземпляром beFirstResponder. Клавиатура появляется как надо, однако она использует клавиатуру ASCII вместо «Цифры и знаки препинания». При втором вызове она работает как надо. Кроме того, если я снова начну с переменной A, все будет нормально. Независимо от того, куда я перемещаю первый экземпляр beFirstResponder, при первом (и только первом) вызове в приложении он ведет себя неправильно.

Обновление: beFirstResponder по-прежнему (даже в первом случае) уважает мой выбор клавиши возврата, но независимо от того, какая клавиатура установлена, она по-прежнему показывает «ASCII Capable». Так что же происходит? Я проверил все в IB, и кажется, что все в порядке ...


person Community    schedule 31.07.2009    source источник
comment
Хорошо, я провел дальнейшее тестирование в симуляторе 3.0, и, похоже, он работает там по сравнению с версией, на которой я его запускал...   -  person    schedule 01.08.2009


Ответы (2)


Я могу подтвердить, что это происходит только на устройстве, а не в симуляторе. Я могу повторить это поведение в версиях 2.2.1, 3.0 и 3.1.

Если у вас есть целая куча текстовых полей, и вы связываете их вместе, вызывая beFirstResponder в textFieldShouldReturn, как показано в примере выше, и все поля настроены на тип клавиатуры UIKeyboardTypeNumbersAndPunctuation, для каждого ВТОРОГО поля клавиатура изменится на UIKeyboardTypeASCIICapable.

Я попытался указать setKeyboardType:UIKeyboardTypeNumbersAndPunctuation явно, но это не имеет значения.

Интересно отметить, что это происходит только в том случае, если вы вызываете beFirstResponder программно. Если пользователь нажимает непосредственно на текстовое поле, клавиатура отображается правильно.

Что еще интереснее, если вы посмотрите на свойство keyboardType в отладчике, оно по-прежнему имеет значение UIKeyboardTypeNumbersAndPunctuation, хотя в интерфейсе отображается клавиатура ASCII.

Причина, по которой это происходит, заключается в том, что ASCII и цифровая клавиатура представляют собой разные режимы одного и того же представления.

Действие по умолчанию клавиши «Далее»/«Возврат» на клавиатуре включает переключение с числового представления обратно на алфавитное представление, и это то, что здесь происходит.

Исправление: верните NO из textFieldShouldReturn, чтобы предотвратить поведение по умолчанию.

person Crufty    schedule 06.10.2009

Пробовали ли вы сначала просто вызвать beFirstResponder в каком-то другом представлении, чтобы когда вы вызывали его в своем текстовом поле, это было не в первый раз?

Кстати, первые два resignFirstResponders избыточны. Они могут даже быть причиной обнаружения ошибки.

person hatfinch    schedule 31.07.2009
comment
хм, я не был уверен, было ли это избыточным или нет. В любом случае, их удаление не меняет поведение приложения. - person ; 31.07.2009