Как вы распускаете клавиатуру при редактировании UITextField - PullRequest
177 голосов
/ 08 ноября 2008

Я знаю, что должен сказать своему UITextField об отставке первого респондента, когда я хочу закрыть клавиатуру, но я не уверен, как узнать, когда пользователь нажал клавишу «Готово» на клавиатуре. Могу ли я посмотреть уведомление?

Ответы [ 21 ]

346 голосов
/ 08 ноября 2008

Я установил делегата UITextField для моего ViewController класса.

В этом классе я реализовал этот метод следующим образом:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}
47 голосов
/ 08 ноября 2008

Если вы подключите событие DidEndOnExit текстового поля к действию (IBAction) в InterfaceBuilder, оно будет отправлено, когда пользователь отклонит клавиатуру (с клавишей возврата), и отправитель станет ссылкой на UITextField, который сработал событие.

Например:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Затем в InterfaceBuilder свяжите событие DidEndOnExit текстового поля с этим действием на вашем контроллере (или всем, что вы используете для связи событий из пользовательского интерфейса). Всякий раз, когда пользователь вводит текст и отклоняет текстовое поле, контроллеру будет отправлено это сообщение.

31 голосов
/ 02 мая 2009

Вы также можете создать метод в вашем контроллере

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

, а затем в Инспекторе подключений в IB подключить к нему событие «Закончилось ли при выходе».

19 голосов
/ 13 ноября 2008

куби, спасибо. Ваш код сработал. Просто чтобы быть явным (как для новичков), как вы говорите, вы должны установить UITextField s delegate равным ViewController, в котором находится текстовое поле. Вы можете сделать это где угодно. Я выбрал viewDidLoad метод.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
18 голосов
/ 15 декабря 2010

Вот трюк для получения автоматического поведения при отключении клавиатуры без кода вообще. В наконечнике отредактируйте прокси-объект «Первый ответчик» в инспекторе удостоверений, добавив новое действие «Первый ответчик»; давайте назовем это dummy:. Теперь подключите событие Did End on Exit текстового поля к действию dummy: прокси-объекта «Первый ответчик». Это оно! Поскольку у события «Завершить при выходе» в текстовом поле теперь есть пара «действие - цель», текстовое поле автоматически отклоняет свою клавиатуру, когда пользователь нажимает «Возврат»; и поскольку нет штрафов за то, что не удалось найти обработчик для сообщения, отправленного по цепочке респондента, приложение не падает, даже если нигде не реализовано dummy:.

11 голосов
/ 19 августа 2010

Просто добавьте

[textField endEditing:YES];

, где вы хотите отключить клавиатуру и отобразить окно выбора.

9 голосов
/ 09 мая 2016

В Swift вы можете написать IBAction в контроллере и установить для этого действия Did End On Exit текстового поля для этого действия

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
4 голосов
/ 16 сентября 2014

Вы также можете использовать

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

Лучший, если у вас много полей Uitext:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }
2 голосов
/ 01 октября 2009

Вы заметите, что метод textFieldShouldReturn предоставляет объект текстового поля, который нажал клавишу DONE. Если вы установите TAG, вы можете включить это текстовое поле. Или вы можете отслеживать и сравнивать указатель объекта со значением некоторого члена, сохраненным его создателем.

Мой подход для самообучения такой:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

Тем временем я поставил «проверку», которая отрицает отставку. Это только для иллюстрации, поэтому, если пользователь печатает НЕТ! в поле, это не уволят. Поведение было таким, как я хотел, но последовательность вывода была не такой, как я ожидал.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

Ниже приведен мой вывод NSLog для этого отказа с последующим принятием. Вы заметите, что я возвращаю результат отставки, но я ожидал, что он вернет мне ЛОЖЬ, чтобы сообщить об этом вызывающей стороне ?! Помимо этого, он имеет необходимое поведение.

13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
2 голосов
/ 21 июня 2012

Вот что я должен был сделать, чтобы заставить его работать, и я думаю, что это необходимо для любого, у кого есть цифровая клавиатура для клавиатуры (или любой другой без кнопки готово:

  1. Я изменил UIView в ViewController на UIControl.
  2. Я создал функцию под названием

    -(IBAction)backgroundIsTapped:(id)sender
    

Это также было определено в файле .h.

После этого я связался с битом «touch down» для ViewController в Интерфейсном Разработчике.

В функции 'background is tapped' я поставил это:

    [answerField resignFirstResponder];

Просто не забудьте изменить answerField на имя UITextField, с которого вы хотите удалить клавиатуру (очевидно, убедитесь, что ваш UITextField определен, как показано ниже:)

    IBOutlet UITextField * <nameoftextfieldhere>;

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

...