it-swarm.com.ru

Скрытие клавиатуры при нажатии кнопки очистки в UITextField

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

20
Naveed Rafi

Да, есть, хотя я подозреваю, что это нарушило бы Apple Принципы взаимодействия с человеком.

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

- (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 есть один символ.

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

41
Moshe

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

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    textField.text = @"";
    return NO;
}
9
Habib Ali

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

2
Alex

В UITextFieldDelegate

 - (BOOL) textFieldShouldClear: (UITextField *) textField {
 [TextField resignFirstResponder]; 
 Вернуть YES; 
} 

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

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

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

1
taskinoor

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

[TextField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.1];
0
Ambili B Menon