iOS - Отключить клавиатуру при касании за пределами UITextField - PullRequest
440 голосов
/ 15 марта 2011

Мне интересно, как заставить клавиатуру исчезать, когда пользователь прикасается к внешней стороне UITextField.

Ответы [ 35 ]

7 голосов
/ 01 июля 2018

Swift 4 oneliner

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
6 голосов
/ 11 марта 2016

Это должен быть самый простой способ скрыть клавиатуру, нажав на нее снаружи:

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

(из Как отключить клавиатуру, когда пользователь нажимает на другую область за пределами текстового поля? )

6 голосов
/ 16 октября 2015

Вы можете сделать это, используя раскадровку в XCode 6 и выше:


Создать действие, чтобы скрыть клавиатуру

Добавьте это в файл заголовка класса, используемого вашим ViewController:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

Затем добавьте это в файл реализации того же ViewController:

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

Теперь это будет одно из «полученных действий» для вашей раскадровки (т. Е. ViewController):

enter image description here


Подключить действие к пользовательскому событию

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

Важно. Вам необходимо преобразовать UIView, который содержится в вашей раскадровке, в UIControl , чтобы он мог получать события. Выберите представление в иерархии сцены View Controller:

enter image description here

... и измените его класс:

enter image description here

Теперь перетащите из маленького кружка рядом с «полученным действием» для вашей сцены на «пустую» часть вашей сцены (фактически вы перетаскиваете «Полученное действие» в UIControl). Вам будет показан выбор событий, к которым вы можете подключить свое действие:

enter image description here

Выберите опцию «подправить изнутри». Теперь вы подключили созданный IBAction к пользовательскому действию касания клавиатуры. Когда пользователь нажимает на клавиатуру, она будет скрыта.

(ПРИМЕЧАНИЕ. Чтобы привязать действие к событию, вы также можете перетащить полученное действие непосредственно в UIControl в иерархии View Controllers. В иерархии оно отображается как «Control».)

5 голосов
/ 01 марта 2013

Если я вас правильно понял, вы хотите отказаться от прослушивания клавиатуры, находящегося вне textfield, но у вас нет ссылки на ваш textfield.

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

  • Возьмем глобальное textField, давайте назовем его reftextField
  • Теперь в textFieldDidBeginEditing установите ссылочное текстовое поле на

    - (void) textFieldDidBeginEditing:(UITextField *)textField{
        reftextField = textField;
    }
    
  • Теперь вы можете счастливоиспользуйте на любой кнопке часы (рекомендуется добавить прозрачную кнопку при начале редактирования)

    - (void)dismissKeyboard {
          [reftextField resignFirstResponder];
    }
    
  • Или для отказа от кнопки Готово попробуйте это.

    //for resigning on done button    
    - (BOOL) textFieldShouldReturn:(UITextField *)textField{
        [textField resignFirstResponder];
        return YES;
    }
    
5 голосов
/ 14 августа 2014

Если представление вообще встроено в UIScrollView, тогда вы можете использовать следующее:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

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

Обратите внимание, что они доступны на iOS 7.0 или выше.

3 голосов
/ 22 ноября 2013

Множество отличных ответов об использовании UITapGestureRecognizer - все они ломают кнопку очистки (X) UITextField.Решение состоит в том, чтобы подавить распознаватель жестов через его делегат:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
    BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
    return !(touchViewIsButton && touchSuperviewIsTextField);
}

Это не самое надежное решение, но оно работает для меня.

3 голосов
/ 22 апреля 2016

Быстрая версия ответа @ Jensen2k:

let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

Один вкладыш

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
3 голосов
/ 29 октября 2015

Вы можете создать категорию для UiView и переопределить мясной переход touchesBegan следующим образом.

Это нормально работает для меня. И это централизованное решение этой проблемы.

#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:true];
    [super touchesBegan:touches withEvent:event];
}
@end
3 голосов
/ 17 июля 2012

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

viewDidLoad:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

Anywhere:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [textFieldName resignFirstResponder];
    puts("Dismissed the keyboard");
}
2 голосов
/ 07 мая 2015

Один из самых простых и коротких способов - добавить этот код в viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];
...