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
}