Вопрос

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

Это было полезно?

Решение

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

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

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}

Другие советы

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

Например:

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

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

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

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

, а затем в Инспекторе подключений в IB connect Event " Did End On Exit " к нему.

Куби, спасибо. Ваш код сработал. Просто чтобы быть явным (для новичков, таких как), как вы говорите, необходимо установить UITextField делегат равным 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;
}

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

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

[textField endEditing:YES];

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

В Swift вы можете написать IBAction в Контроллере и установить для этого действия Сделано в конце при выходе текстового поля для этого действия

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}

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

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

   [self.yourTextField resignFirstResponder];

  }

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

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }

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

<Ол>
  • Я изменил UIView в ViewController на UIControl.
  • Я создал функцию под названием

    -(IBAction)backgroundIsTapped:(id)sender
    
  • Это также было определено в файле .h.

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

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

        [answerField resignFirstResponder];
    

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

        IBOutlet UITextField * <nameoftextfieldhere>;
    

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

    Вы заметите, что метод " 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
    

    Вот довольно простой способ завершить выпуск с помощью клавиши возврата или касания в фоновом режиме.

    В Interface builder встроите свои поля в представление класса UIFormView

    Что делает этот класс :

    • Автоматически присоединяется в качестве делегата полей ( либо активируется из nib, либо добавляется вручную)
    • Сохраните ссылку на текущее редактируемое поле
    • Отключите клавиатуру при возврате или коснитесь в фоновом режиме

    Вот этот код :

    Интерфейс

    #import <UIKit/UIKit.h>
    
    @interface UIFormView : UIView<UITextFieldDelegate>
    
    -(BOOL)textFieldValueIsValid:(UITextField*)textField;
    -(void)endEdit;
    
    @end
    

    Реализация

    #import "UIFormView.h"
    
    @implementation UIFormView
    {
        UITextField* currentEditingTextField;
    }
    
    // Automatically register fields
    
    -(void)addSubview:(UIView *)view
    {
        [super addSubview:view];
        if ([view isKindOfClass:[UITextField class]]) {
            if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
        }
    }
    
    // UITextField Protocol
    
    -(void)textFieldDidBeginEditing:(UITextField *)textField
    {
        currentEditingTextField = textField;
    }
    
    -(void)textFieldDidEndEditing:(UITextField *)textField
    {
        currentEditingTextField = NULL;
    }
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        [self endEdit];
    }
    
    - (BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        if ([self textFieldValueIsValid:textField]) {
            [self endEdit];
            return YES;
        } else {
            return NO;
        }
    }
    
    // Own functions
    
    -(void)endEdit
    {
        if (currentEditingTextField) {
            [currentEditingTextField endEditing:YES];
            currentEditingTextField = NULL;
        }
    }
    
    
    // Override this in your subclass to handle eventual values that may prevent validation.
    
    -(BOOL)textFieldValueIsValid:(UITextField*)textField
    {
        return YES;
    }
    
    @end
    
    • Путем создания подкласса формы и переопределения textFieldValueIsValid: таким образом, вы можете избежать завершения редакции, если значение неверно для данного поля.

    • Если поле имеет делегат, установленный в Interface Builder, то форма его не изменяет.Я не вижу много причин устанавливать другой делегат для определенного поля, но почему бы и нет…

    Существует много способов улучшить этот класс представления формы - прикрепить делегата, выполнить некоторую разметку, обрабатывать, когда клавиатура закрывает поле ( используя фрейм currentEditingTextField ), автоматически запускать редакцию для следующего поля, ...

    Я лично сохраняю его в своем фреймворке и всегда создаю подкласс для добавления функций, он довольно часто полезен "как есть".

    Я надеюсь, что это поможет.Выпьем за всех

    если вы хотите все редактирование в UIViewController вы можете использовать.

    [[self view]endEditing:YES];
    

    и если вы хотите закрыть скрытую скрытую клавиатуру UITextField, используйте

    .

    1. добавить делегата в ваш viewcontroller.h

    <UITextFieldDelegate>
    
    1. делает делегирование невозможным для вашего текстового поля.

      self.yourTextField.delegate = self;

    2. добавьте этот метод в ваш viewcontroller.

      - (BOOL) textFieldShouldEndEditing: (UITextField *) textField { [textField resignFirstResponder]; вернуть ДА;}

    Программно установите делегат UITextField в swift 3

    Реализуйте UITextFieldDelegate в своем файле ViewController.Swift (например, класс ViewController: UIViewController, UITextFieldDelegate {)

     lazy var firstNameTF: UITextField = {
    
        let firstname = UITextField()
        firstname.placeholder = "FirstName"
        firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
        firstname.textAlignment = .center
        firstname.borderStyle = UITextBorderStyle.roundedRect
        firstname.keyboardType = UIKeyboardType.default
        firstname.delegate = self
        return firstname
    }()
    
    lazy var lastNameTF: UITextField = {
    
        let lastname = UITextField()
        lastname.placeholder = "LastName"
        lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
        lastname.textAlignment = .center
        lastname.borderStyle = UITextBorderStyle.roundedRect
        lastname.keyboardType = UIKeyboardType.default
        lastname.delegate = self
        return lastname
    }()
    
    lazy var emailIdTF: UITextField = {
    
        let emailid = UITextField()
        emailid.placeholder = "EmailId"
        emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
        emailid.textAlignment = .center
        emailid.borderStyle = UITextBorderStyle.roundedRect
        emailid.keyboardType = UIKeyboardType.default
        emailid.delegate = self
        return emailid
    }()
    

    // Пометка: - обработка делегата textField ..

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    
        if textField == firstNameTF {
    
            lastNameTF.becomeFirstResponder()
        }
    
        else if textField == lastNameTF {
    
            emailIdTF.becomeFirstResponder()
        }
        else {
            view.emailIdTF(true)
        }
        return true
    }
    

    Создайте функцию hidekeyboard и свяжите ее с текстовым полем в файле .xib и выберите DidEndOnExit

    -(IBAction)Hidekeyboard    
    {    
          textfield_name.resignFirstResponder;    
    }  
    

    Если вы создали представление с помощью Interface Builder, используйте следующее Просто создайте метод,

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

    Просто щелкните правой кнопкой мыши текстовое поле в представлении, установите для события значение «Завершить при выходе» и подключите его к методу " dismissKeyboard ".

    Лучшее руководство для начинающих       " Разработка приложений для iPhone и iPad Head First, второе издание "

    попробуйте это

    - (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"\n"]) {
            [textView resignFirstResponder];
            return NO;
        }
        return YES;
    }
    
    //====================================================
    //                  textFieldShouldReturn:
    //====================================================
    -(BOOL) textFieldShouldReturn:(UITextField*) textField { 
        [textField resignFirstResponder];
        if(textField.returnKeyType != UIReturnKeyDone){
            [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
        }
        return YES;
    }
    

    Кто ищет Swift 3

    1) Убедитесь, что ваш делегат UITextField подключен к вашему ViewController в раскадровке

    2) Реализуйте UITextFieldDelegate в своем файле ViewController.Swift (например, класс ViewController: UIViewController, UITextFieldDelegate {)

    3) Используйте метод делегата ниже

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
       textField.resignFirstResponder()  
    return false }
    

    Вот как я отклоняю клавиатуру в Swift 4.2, и она работает для меня:

        override func viewDidLoad() {
        super.viewDidLoad()
    
        let tap = UITapGestureRecognizer(target: self, action: 
        #selector(dismissKeyboard))
    
        view.addGestureRecognizer(tap)
        }
    
        @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
        numberField.resignFirstResponder()
        }
    

    Swift 3, iOS 9+

    @IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

    UPD:У меня это по-прежнему прекрасно работает.Я думаю, парень, посвятивший этот ответ, просто не понимал, что ему нужно привязать это действие к UITextField в раскадровке.

    textField.returnKeyType = UIReturnKeyDone;
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top