ResignFirstResponder не скрывает клавиатуру на textFieldShouldReturn
У меня есть представление с UITextField, который должен скрывать клавиатуру при нажатии на возврат.
Моя функция такова:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ( textField == userPassword ) {
[textField resignFirstResponder];
}
return YES;
}
Обычно клавиатура должна быть скрыта, но она остается на экране. Правильно вызывается resignFirstResponder. Что мне не хватает?
Ответы
Ответ 1
Я вижу, что у вас есть iPad-тег. Вы представляете модальное представление с помощью UIModalPresentationFormSheet? Если это так, похоже, это ограничение модальной презентации FormSheet (либо Apple делает это намеренно по какой-то причине, либо это ошибка). Дополнительные сведения см. В этих других вопросах:
Модальный диалог не отключает клавиатуру
Modal View Controller с клавиатурой на ландшафте iPad изменяет местоположение при его увольнении
Ответ 2
Существует такой полезный метод, который позволяет вам отклонить клавиатуру при представлении модального диалога:
- (BOOL)disablesAutomaticKeyboardDismissal { return NO; }
Это переопределит поведение по умолчанию модального диалога, установленного Apple, и позволит вам отменить клавиатуру. Он находится в классе UIViewController.
Надеюсь, это поможет кому-то!
Ответ 3
Если вы используете построитель интерфейсов, посмотрите, имеет ли ваш UITextField делегированный объект, связанный с вашим классом.
-Выберите свой UITextField и в своих подключениях, если выходите из одного соединения в Outlets- > delegate. Если нет, подключитесь к вам классом владельца файла.
Это необходимо связать с классом владельца файла. Этот делегат рассказывает, где искать метод. Если вы переопределяете метод, вам нужно указать, где объект будет искать это.
Ответ 4
Это решение работало для меня после того, как ничего из этого не было сделано. после вызова resignFirstResponder я добавил модальное представление и удалил его.
[myTextField resignFirstResponder];
UIViewController *dummyController = [[UIViewController alloc] init];
UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)];
[dummyController setView:dummy];
[self presentModalViewController:dummyController animated:NO];
[dummyController dismissModalViewControllerAnimated:NO];
Ответ 5
Чтобы справиться с ошибкой, упомянутой Брэндоном, вы можете попробовать закрыть и снова открыть свой контроллер модального просмотра, если у вас все еще есть ссылка на него.
[textField resignFirstResponder];
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:yourModalViewControllerReference animated:NO];
(где "self" должен быть контроллером, который вы использовали для первоначального открытия контроллера модального представления)
Ответ 6
У меня была такая же проблема. Я понял, что после подключения делегата к файловому владельцу в построителе интерфейсов я забыл сохранить в Interface Builder. Как только я сохранил, я перекомпилировал, и клавиатура исчезла правильно, когда вы вернетесь.
Ответ 7
xcode 4.5.1
Просто нажмите кнопку управления, а затем в текстовом поле перетащите и отпустите файл .h
(управляющий ключ + перетащить)
затем во всплывающем меню выберите
connection=acton;
name= any name;
type=id;
event=did end on exit;
arguments=sender;
затем нажмите кнопку подключения
Ответ 8
Не помните ли вы реализовать протокол UITextFieldDelegate
?
Ответ 9
Я прочитал так много статей об этой проблеме, где экранная клавиатура отказывается скрываться, когда вы вызываете resignFirstResponder
, но ни одно из предложений не работало для меня.
Я использую XCode 5 (iOS 7) и имею экран iPhone, содержащий пару элементов управления, для которых требуется экранная клавиатура, но если пользователь нажимает на UIButton
, то я хочу, чтобы клавиатура исчезла.
![enter image description here]()
Я, вероятно, потратил целый день на эксперимент с resignFirstResponder
и добавил функции disablesAutomaticKeyboardDismissal
, чтобы возвращать NO, но ничего не получилось. Как только появилась экранная клавиатура, я больше не мог ее снова исчезнуть.
Но потом у меня была небольшая мозговая волна (поскольку у меня только небольшой мозг).
Теперь, когда пользователь нажимает на мой UIButton
, я просто отключу элементы управления UITextField
и UITextView
.
- (IBAction)btnDate_Tapped:(id)sender {
// The user has clicked on the "Date" button.
self.tbClientName.enabled = NO;
self.tbComments.editable = NO;
И вдруг приложение обнаруживает, что у него нет редактируемых текстовых полей, требующих экранной клавиатуры, и он аккуратно скрывает клавиатуру из поля зрения.
(Ослабленный вздох.)
My UIButton
фактически создает всплывающее диалоговое окно. Когда пользователь отклоняет всплывающее окно, я снова включаю эти два элемента управления, поэтому, если пользователь вступает в один из них, клавиатура снова появится.
-(void)popoverControllerDidDismissPopover:(UIPopoverController *) popoverController {
// The user has closed our popup dialog.
// We need to make our UITextField and UITextView editable again.
self.tbClientName.enabled = YES;
self.tbComments.editable = YES;
... etc...
}
Простой, не так ли?
И удивительно, что это обходное решение работает даже на UIViewControllers
, которые появляются в стиле Модальный.
Я надеюсь, что это поможет другим жертвам XCode.
Ответ 10
Исходя из вашего комментария, похоже, что фокус сместился, я думаю, что может случиться, что клавиатура остается открытой для следующего поля ввода текста. Если ваш ключ возврата является клавишей "Далее", а затем возвращает YES для textFieldShouldReturn: сделает следующий textField первым ответчиком и сохранит клавиатуру.
Ответ 11
Самый простой способ:
-
Перейдите к построителю пользовательского интерфейса,
-
выберите UITextField
и "Control-Drag" в "Detail View Controller-Detail" и отпустите.
-
Всплывающее окно. Затем в разделе "Выходы" выберите "Делегат".
Что это. Это сработало для меня.
Ответ 12
если вы находитесь в UIModalPresentationFormSheet, просто вызовите
- (BOOL)disablesAutomaticKeyboardDismissal
{
return NO;
}
Ответ 13
Swift 3.0:
override var disablesAutomaticKeyboardDismissal: Bool {
get{
return false
}
set {
self.disablesAutomaticKeyboardDismissal = false
}
}
Ответ 14
Swift 3.0
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == addressTextField {
textField.resignFirstResponder()
return false
}
return true
}