Скрытие клавиатуры

У меня есть UISearchBar, а в методе делегата я скрываю клавиатуру, когда текстовое поле очищается:

- (void)searchBar:(UISearchBar *)filterBar textDidChange:(NSString *)filterText {
    NSLog(@"filter: %@", filterText);

    if ([filterText length] == 0) {
        NSLog(@"hiding keyboard");
        [filterBar resignFirstResponder ];

Теперь, когда я использую кнопку возврата, чтобы убрать поисковый запрос, все в порядке. Клавиатура скрывается, когда поиск становится пустым. Не так, когда я нажимаю кнопку «крестик», чтобы полностью очистить поле поиска.

Что ж, не совсем так. Я вызываю resignFirstResponder и скрываю клавиатуру - вы просто не можете ее видеть, потому что она сразу возвращается. Я выяснил это, наблюдая за событиями отображения / скрытия клавиатуры.

Так почему же клавиатура снова отображается? Как я могу предотвратить это?

Я уже пробовал пройтись по всем подпредставлениям UISearchBar, а также вызвать для них resignFirstResponder ... но если я не сделал что-то не так, это тоже не решает эту проблему.

Обновление:

На самом деле я получил клавиатуру, чтобы не отключать кнопку "Готово" :-D ... так что я "перестану" идти по этой дороге, как предложил Кевин. Тем не менее, я хотел бы знать, почему клавиатура вернулась именно так.


person tcurdt    schedule 14.01.2009    source источник


Ответы (4)


Я в основном согласен с Кевином, но это вам не помогает, так что вот оно:

Попробуйте перебрать подпредставления на панели поиска и найти брата, принадлежащего к классу UITextField. Затем либо установите свойство делегата этого текстового поля в свой класс ViewController и обработайте там обратный вызов (например, textViewShouldReturn), либо просто вызовите resignFirstResponder непосредственно в текстовом поле. Первое, очевидно, нужно делать во время инициализации / загрузки, а второе можно сделать в существующем обратном вызове textDidChange.

Вот еще несколько указателей:

http://discussions.apple.com/thread.jspa?threadID=1479468&tstart=0 http://discussions.apple.com/thread.jspa?messageID=8176608

person Erik Abele    schedule 14.01.2009
comment
Я уже пробовал пройти все подпредставления UISearchBar, а также вызвать resignFirstResponder для них ... но если я не сделал что-то не так - это тоже не решает эту проблему. ... так ты уверен, что это работает? - person tcurdt; 15.01.2009
comment
Да, я уверен, что это сработало полгода назад, когда я был в подобной ситуации - я никогда не пошел по этому пути и удалил этот код позже - но мои журналы svn говорят мне, что это работало в то время :-) - person Erik Abele; 15.01.2009

Я предлагаю вам прекратить попытки сделать это. Скрытие клавиатуры при пустом поле - совершенно нестандартное поведение, и пользователь этого не ожидает. В таких ситуациях гораздо лучше поддерживать согласованность поведения со всеми остальными приложениями в системе.

person Lily Ballard    schedule 14.01.2009
comment
Я бы с удовольствием… но, к сожалению, кнопка «Готово» на клавиатуре отключается, когда длина текста равна 0. Использование дополнительной кнопки «Отмена» не только противоречит здравому смыслу и намного хуже с точки зрения пользователя, но также убивает требуемое состояние экрана. См. Также thismuchiknow.co.uk/?p=85. - person tcurdt; 14.01.2009

Я вижу, вы приняли ответ и не планируете продолжать в том же духе, но мне любопытно, сможете ли вы добиться чего-то подобного, реализовав это:

- (BOOL)canBecomeFirstResponder
{
   return !preventingKeyboardAppearance; // so to speak
}

- (void)searchBar:(UISearchBar *)filterBar textDidChange:(NSString *)filterText 
{
   // handle text

   preventingKeyboardAppearance = YES;
   [filterBar resignFirstResponder];
}

Я не понимаю, при каких обстоятельствах вы бы установили для preventKeyboardAppearance значение NO, но мне интересно, сработает ли это.

person Amagrammer    schedule 24.07.2009

-(BOOL)textFieldShouldReturn:(UITextField *)textField {
        [textField resignFirstResponder];

        return YES;    
    }

[textField resignFirstResponder] некоторое время не работает, поэтому используйте этот
[YorTextFieldName resignFirstResponder] он работает правильно, а не какая-либо другая функция для скрытия границы клавиш

person jayesh kavathiya    schedule 18.08.2012