Скрытие клавиатуры при нажатии кнопки очистки в UITextField - PullRequest
21 голосов
/ 30 января 2011

Есть ли способ скрыть клавиатуру, когда нажата кнопка очистки UITextField?

Ответы [ 5 ]

41 голосов
/ 30 января 2011

Да, есть, хотя я подозреваю, что это нарушит Рекомендации Apple Human Interface Guidelines.

Для этого добавьте следующий метод в файл реализации вашего контроллера представления.Затем сделайте контроллер представления в делегате вашего текстового поля.

- (BOOL) textFieldShouldClear:(UITextField *)textField{
    [textField resignFirstResponder];   
    return YES;
}

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

-(IBAction)hideKeyboardFromTextField:(id)sender{
  //TODO: Check if the previous value was longer than one character to differentiate
  //between backspace and clear. 

  //check if the editing caused the box to be empty
  if([[sender value] isEqualToString:@""] || [sender value] == nil)
    [sender resignFirstResponder];
  }
}

Проблема здесь в том, что вы не можете легко различить нажатие на кнопку очистки и нажатие на кнопку удаления, когда в UITextField есть один символ.

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

9 голосов
/ 24 октября 2014

Этот код определенно работает для меня, чтобы скрыть клавиатуру при очистке содержимого текстового поля

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    textField.text = @"";
    return NO;
}
2 голосов
/ 30 января 2011

Да. Вызовите resignFirstResponder в текстовом поле в методе делегата textFieldShouldClear:.

1 голос
/ 30 января 2011

В UITextFieldDelegate

- (BOOL)textFieldShouldClear:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

Но есть проблема с этим. Из руководства "Текстовое поле вызывает этот метод в ответ на нажатие пользователем встроенной кнопки очистки. (Эта кнопка не отображается по умолчанию, но ее можно включить, изменив значение в свойстве clearButtonMode текстового поля.) Этот метод также вызывается, когда начинается редактирование, а свойство clearsOnBeginEditing текстового поля имеет значение YES. "

Обратите внимание, что этот метод вызывается, когда редактирование начинается, если для clearsOnBeginEditing задано значение YES. Поэтому, если вы вызовете resignFirstResponder в этом методе, редактирование фактически не начнется. Поэтому вам нужно установить clearsOnBeginEditing в NO. Очевидно, что текстовое поле не будет очищено при начале редактирования.

Еще один ВАЖНЫЙ вопрос, не связанный напрямую с вопросом. Скрывать клавиатуру после нажатия кнопки очистки не является привычным поведением, и Apple НЕ нравится изменять поведение стандартных элементов. Вы можете получить отказ за это.

0 голосов
/ 28 ноября 2012

Попробуйте этот код:

[TextField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...