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

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

Ответы [ 21 ]

1 голос
/ 03 ноября 2015

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

[[self view]endEditing:YES];

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

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

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

    self.yourTextField.delegate = self;

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

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

1 голос
/ 08 сентября 2015

Вот довольно чистый способ завершить издание ключом возврата или касанием на заднем плане.

В Интерфейсном Разработчике вставьте свои поля в представление класса UIFormView

Что означает этот класс:

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

Вот код:

Интерфейс

#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: метод, вы можно избежать конца издания, если значение не является правильным для данного поле.

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

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

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

Надеюсь, это поможет. Ура все

1 голос
/ 28 декабря 2017

Программно установить делегат UITextField в быстром 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
}
0 голосов
/ 24 июня 2013
textField.returnKeyType = UIReturnKeyDone;
0 голосов
/ 14 сентября 2014
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}
0 голосов
/ 31 января 2014

попробуйте

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
0 голосов
/ 06 января 2017

Кто ищет Swift 3

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

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

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

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }
0 голосов
/ 05 сентября 2017

Swift 3, iOS 9 +

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

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

0 голосов
/ 12 сентября 2013

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

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
0 голосов
/ 22 февраля 2019

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