Как вы отключаете клавиатуру при редактировании UITextField

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

Ответ 1

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

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

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

Ответ 2

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

Например:

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

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

Ответ 3

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

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

а затем в Connection Inspector в IB подключите к нему событие "Закончено на выходе".

Ответ 4

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

Ответ 5

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

Ответ 6

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

[textField endEditing:YES];

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

Ответ 7

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

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

Ответ 8

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

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

   [self.yourTextField resignFirstResponder];

  }

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

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

Ответ 9

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

Между тем, я поставил тест проверки, который отрицает отставку. Это только для иллюстрации, поэтому, если пользователь вводит NO! в поле, он не будет уволен. Поведение было таким, каким я хотел, но последовательность вывода была не такой, как я ожидал.

- (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

Ответ 10

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

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

    -(IBAction)backgroundIsTapped:(id)sender
    

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

После этого я привязался к бит "touch down" для ViewController в построителе интерфейсов.

В функции "background is tapped" я помещаю это:

    [answerField resignFirstResponder];

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

    IBOutlet UITextField * <nameoftextfieldhere>;

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

Ответ 11

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

В построителе интерфейса вставьте свои поля в представление класса 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), автоматически запускает выпуск для следующего поля,...

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

Надеюсь, это поможет. Приветствия всех

Ответ 12

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

[[self view]endEditing:YES];

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

делегат 1.add в вашем viewcontroller.h

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

    self.yourTextField.delegate = self;

  2. добавьте этот метод в свой диспетчер view.

    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField { [textField resignFirstResponder]; return YES;}

Ответ 13

Программно установить делегат 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
}()

//Mark: - обработка делегата 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
}

Ответ 14

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

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

Ответ 15

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

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

Просто щелкните текстовое поле в представлении и установите событие как "Закончить на выходе" и подключите его к методу "cancelKeyboard".

Лучшим руководством для начинающих является      "Head First iPhone и iPad Development, 2nd Edition"

Ответ 16

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

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}

Ответ 17

//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

Ответ 18

Любой, кто ищет Swift 3

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

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

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

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

Ответ 19

Вот как я отклоняю клавиатуру в 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()
    }

Ответ 20

Swift 4.2 и будет работать на 100%

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.delegate = self

    }

    // hide key board when the user touches outside keyboard

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    // user presses return key

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

}

Ответ 21

Swift 3, iOS 9+

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

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

Ответ 22

textField.returnKeyType = UIReturnKeyDone;