Как программно закрыть клавиатуру iOS при нажатии return


105

Я создал UITextFieldпрограммно, создав UITextFieldсвойство a для viewController. Мне нужно убрать клавиатуру с возвратом и касанием экрана. Мне удалось отключить касание экрана, но нажатие возврата не работает.

Я видел, как это сделать с помощью раскадровки, а также путем UITextFieldнепосредственного выделения и инициализации объекта без создания его как свойства. Можно сделать?

.час

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
    
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
    
}

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

@end

Ответы:


265

Самый простой способ - подключить делегата UITextFieldк self ( self.mytestField.delegate = self) и закрыть клавиатуру в методе, textFieldShouldReturnиспользуя[textField resignFirstResponder];

Еще один способ закрыть клавиатуру:

[self.view endEditing:YES];

Укажите место, [self.view endEditing:YES];где вы хотите закрыть клавиатуру (событие кнопки, событие касания и т. Д.).


когда я подключаю делегата, я получаю предупреждения и / или ошибки. Я видел ваш способ раньше, но по какой-то причине не могу заставить его работать. Могут ли эти методы войти в viewDidLoad?
noobsmcgoobs

1
Если вы получали ошибку, когда пытались установить делегат textField в значение self, то вы, вероятно, не добавили UITextFieldDelegate в определение класса. В частности ... class ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting 06

29

Добавьте такой метод делегата UITextField:

@interface MyController : UIViewController <UITextFieldDelegate>

И установите, а textField.delegate = self;затем добавьте два метода делегатаUITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Мы должны добавить, что вышеперечисленное работает только в том случае, если ваш контроллер реализует UITextFieldDelegate следующим образом: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatel Я использовал эти 2 метода, а также добавил self.username.delegate = self и [self.username resignFirstResponder] в viewDidLoad. Это работает для обоих нужных мне сценариев. Это нормально или я использую слишком много кода?
noobsmcgoobs


24

просто используйте это быстро, чтобы закрыть клавиатуру:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Swift 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)

SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff

17

SWIFT 4:

self.view.endEditing(true)

или

Установите делегата текстового поля на текущий контроллер просмотра, а затем:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Цель-C:

[self.view endEditing:YES];

или

Установите делегата текстового поля на текущий контроллер просмотра, а затем:

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

    return YES;
}

9

В делегате приложения вы можете написать

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

таким образом можно не писать слишком много кода.


7

Постарайтесь понять, что такое первый респондент в иерархии представлений iOS. Когда ваше текстовое поле становится активным (или первым респондентом), когда вы касаетесь его (или передаете ему сообщение becomeFirstResponderпрограммно), оно представляет клавиатуру. Итак, чтобы удалить ваше текстовое поле из числа первого респондента, вы должны передать ему сообщение resignFirstResponder.

[textField resignFirstResponder];

А чтобы скрыть клавиатуру на кнопке возврата, вы должны реализовать метод делегата textFieldShouldReturn:и передать resignFirstResponderсообщение.

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

7

Вот что я использую в своем коде. Работает как часы!

В yourviewcontroller.h добавьте:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Теперь в файле .m добавьте это в свою функцию ViewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Также добавьте эту функцию в файл .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

1
просто запомните действие: @selector должен вызывать то же имя метода, что и endEditing: ДА, в данном случае "handleSingleTap:"
Маркос Ребукас

4

Чтобы закрыть клавиатуру после того, как клавиатура выскочила, есть 2 случая :

  1. когда UITextField находится внутри UIScrollView

  2. когда UITextField находится за пределами UIScrollView

2. когда UITextField находится за пределами UIScrollView, переопределите метод в вашем подклассе UIViewController

вы также должны добавить делегата для всех UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. В представлении прокрутки нажатие снаружи не вызовет никаких событий , поэтому в этом случае используйте распознаватель жестов касания , перетащите UITapGesture для представления прокрутки и создайте для него IBAction .

чтобы создать IBAction, нажмите ctrl + щелкните UITapGesture и перетащите его в файл .h контроллера просмотра.

Здесь я назвал tappedEvent своим именем действия

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

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

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


Спасибо. Ваш ответ мне помог ..!
Archit Kapoor

4

Для группы UITextViews внутри a ViewController:

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Цель-C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}


3

Поскольку теги говорят только о iOS, я опубликую ответ для Swift 1.2 и iOs 8.4, добавьте их в свой класс быстрого управления представлением:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

Также не забудьте добавить UITextFieldDelegate в объявление класса и установить для делегата текстовых полей значение self (представление).


3

В Swift 3

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

ИЛИ

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }

2

Итак, вот что я сделал, чтобы он исчез после касания фона или возврата. Мне пришлось добавить делегат = self в viewDidLoad, а затем также методы делегата в файлы .m.

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



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

@end

2

Просто используйте это в Objective-C, чтобы закрыть клавиатуру:

[[UIApplication sharedApplication].keyWindow endEditing:YES];

1

Сначала вам нужно добавить удаление текстового поля в файл .h. если не объявить (BOOL)textFieldShouldReturn:(UITextField *)textFieldэтот метод не вызываемым. поэтому сначала добавьте делегата и напишите код скрытия клавиатуры в этот метод.

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

Попробуй это..


0

Добавить делегата: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

а затем добавьте этот метод делегата

// Это должно работать отлично

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

0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

когда вы используете более одного текстового поля на экране. С помощью этого метода вам не нужно каждый раз упоминать текстовое поле, например

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

Swift 2:

это то, что сделал, чтобы сделать все!

закрыть клавиатуру с помощью Doneкнопки или Touch outSide, Nextчтобы перейти к следующему вводу.

Первое изменение TextFiled Return KeyЧтобы Nextв раскадровке.

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}

0

Если вы не знаете текущий контроллер представления или текстовое представление, вы можете использовать Responder Chain:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)

0

для быстрых 3-4 я исправил как

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

просто скопируйте вставку в любом месте класса. Это решение просто работает, если вы хотите, чтобы все UItextfield работали одинаково, или если у вас есть только одно!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.