У меня есть UISearchBar, а в методе делегата я скрываю клавиатуру, когда текстовое поле очищается:
- (void)searchBar:(UISearchBar *)filterBar textDidChange:(NSString *)filterText {
NSLog(@"filter: %@", filterText);
if ([filterText length] == 0) {
NSLog(@"hiding keyboard");
[filterBar resignFirstResponder ];
Теперь, когда я использую кнопку возврата, чтобы убрать поисковый запрос, все в порядке. Клавиатура скрывается, когда поиск становится пустым. Не так, когда я нажимаю кнопку «крестик», чтобы полностью очистить поле поиска.
Что ж, не совсем так. Я вызываю resignFirstResponder и скрываю клавиатуру - вы просто не можете ее видеть, потому что она сразу возвращается. Я выяснил это, наблюдая за событиями отображения / скрытия клавиатуры.
Так почему же клавиатура снова отображается? Как я могу предотвратить это?
Я уже пробовал пройти все подвиды UISearchBar, а также вызвать resignFirstResponder на них ... но если я не сделал что-то не так - это тоже не решает эту проблему.
Обновлять:
На самом деле я получил клавиатуру, чтобы не отключать кнопку «Готово» :-D ... так что я «перестану» идти по этому пути, как предложил Кевин. Тем не менее, я хотел бы знать, почему клавиатура вернулась именно так.





Я бы посоветовал вам останавливаться попытаться это сделать. Скрытие клавиатуры при пустом поле - совершенно нестандартное поведение, и пользователь этого не ожидает. В подобных ситуациях гораздо лучше сохранять согласованность поведения со всеми остальными приложениями в системе.
Я в основном согласен с Кевином, но это вам не помогает, так что вот оно:
Попробуйте перебрать в цикле подпредставления на панели поиска и найти брата, принадлежащего к классу UITextField. Затем либо установите свойство делегата этого текстового поля в свой класс ViewController и обработайте там обратный вызов (например, textViewShouldReturn), либо просто вызовите resignFirstResponder непосредственно в текстовом поле. Первое, очевидно, нужно делать во время инициализации / загрузки, а второе можно сделать в существующем обратном вызове textDidChange.
Вот еще несколько указателей:
http://discussions.apple.com/thread.jspa?threadID=1479468&tstart=0http://discussions.apple.com/thread.jspa?messageID=8176608
«Я уже пробовал пройти все подвиды UISearchBar и также вызвать resignFirstResponder для них ... но если я не сделал что-то не так - это тоже не решит эту проблему». ... так ты уверен, что это работает?
Да, я уверен, что это сработало полгода назад, когда я был в похожей ситуации - я никогда не пошел по этому пути и удалил этот код позже - но мои журналы svn говорят мне, что это работало в то время :-)
Я вижу, вы приняли ответ и не планируете продолжать в том же духе, но мне, являюсь, любопытно, сможете ли вы добиться чего-то подобного, реализовав это:
- (BOOL)canBecomeFirstResponder
{
return !preventingKeyboardAppearance; // so to speak
}
- (void)searchBar:(UISearchBar *)filterBar textDidChange:(NSString *)filterText
{
// handle text
preventingKeyboardAppearance = YES;
[filterBar resignFirstResponder];
}
Я не понимаю, при каких обстоятельствах вы бы установили для preventKeyboardAppearance значение NO, но мне интересно, сработает ли это.
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
[textField resignFirstResponder] некоторое время не работает, поэтому используйте это
[YorTextFieldName resignFirstResponder] он работает правильно, а не какой-либо другой
функция для скрытия борда клавиш
Я бы с удовольствием ... но, к сожалению, кнопка «Готово» на клавиатуре отключается, когда длина текста равна 0. Использование дополнительной кнопки «Отмена» не только противоречит здравому смыслу и намного хуже с точки зрения пользователя, но также убивает требуемое состояние экрана. Также см. thismuchiknow.co.uk/?p=85