Мне интересно, как заставить клавиатуру исчезать, когда пользователь касается вне UITextField
.
Мне интересно, как заставить клавиатуру исчезать, когда пользователь касается вне UITextField
.
Ответы:
Вам нужно будет добавить UITapGestureRecogniser
и назначить его представлению, а затем вызвать отставку первым респондентом наUITextField
на его селектора.
Код:
В viewDidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
В dismissKeyboard:
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
(Где aTextField
текстовое поле, которое отвечает за клавиатуру)
Версия Swift 3 выглядит так
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
Для dismissKeyboard
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
aTextField.resignFirstResponder()
}
[aTextField resignFirstResponder]
было бы, [self.view endEditing:YES];
это не нуждается в ссылке на текстовое поле и будет работать для нескольких текстовых полей
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
за ответ @qiaoyi; У меня была проблема с таблицей, не отвечающей на выбор строки. 5 лет спустя, надеюсь, это поможет кому-то еще.
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Я растянул несколько ответов.
Используйте ивар, который инициализируется во время viewDidLoad:
UIGestureRecognizer *tapper;
- (void)viewDidLoad
{
[super viewDidLoad];
tapper = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapper];
}
Уволить то, что когда-либо в настоящее время редактирует:
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
Проверьте это, это будет самый простой способ сделать это,
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];// this will do the trick
}
Или
Эта библиотека будет обрабатывать, включая автоматическую прокрутку полосы прокрутки, нажатие клавиши пробела, чтобы скрыть клавиатуру и т. Д.
Я вижу, что у некоторых людей возникают проблемы с использованием UITapGestureRecognizer
метода. Самый простой способ, которым я выполнил эту функцию, при этом оставляя неизменным поведение нажатия моей существующей кнопки, это добавление только одной строки к ответу @ Jensen2k:
[tap setCancelsTouchesInView:NO];
Это позволило моим существующим кнопкам по-прежнему работать без использования метода @Dmitry Sitnikov.
Прочитайте об этом property
здесь (поиск CancelsTouchesInView
): Ссылка на класс UIGestureRecognizer
Я не уверен, как это будет работать с полосами прокрутки, так как я вижу, что у некоторых были проблемы, но, надеюсь, кто-то еще может столкнуться с тем же сценарием, что и у меня.
UIImageView
, добавьте, [imageView setUserInteractionEnabled:NO];
и вы «щелкнете» по нему, чтобы этот метод работал.
Лучше сделать ваш UIView
экземпляр UIControl
(в конструкторе интерфейсов) и затем связать их TouchUpInside
событие с dismissKeyboard
методом. Этот IBAction
метод будет выглядеть так:
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
мешало постукивать по кнопкам внутри вида). touchesEnded
не сработало, потому что произошла UIScrollView
путаница с цепочкой респондента.)
Swift 4
Настройте UIViewController
этот метод расширения один раз, например viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.setupHideKeyboardOnTap()
}
и клавиатура будет закрыта даже при нажатии на NavigationBar
.
import UIKit
extension UIViewController {
/// Call this once to dismiss open keyboards by tapping anywhere in the view controller
func setupHideKeyboardOnTap() {
self.view.addGestureRecognizer(self.endEditingRecognizer())
self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
}
/// Dismisses the keyboard from self.view
private func endEditingRecognizer() -> UIGestureRecognizer {
let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
tap.cancelsTouchesInView = false
return tap
}
}
Версия Swift, это работает в сочетании с другими элементами (вроде того UIButton
или другого UITextField
):
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
self
а неself.view
canclesTouchesInView
это удобное свойство для использования. Спасибо.
c#
. К сведению, что точка с запятой разрешена по синтаксису, просто нет необходимости.
Как насчет этого: я знаю, что это старый пост. Это может помочь кому-то :)
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray *subviews = [self.view subviews];
for (id objects in subviews) {
if ([objects isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objects;
if ([objects isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}
Это хорошее общее решение:
Objective-C:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
Swift:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
Основано на решении @icodebuster: https://stackoverflow.com/a/18756253/417652
Swift 4 oneliner
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
Я думаю, что самый простой (и лучший) способ сделать это - создать подкласс вашего глобального представления и использовать hitTest:withEvent
метод для прослушивания любого прикосновения. Касания на клавиатуре не зарегистрированы, поэтому hitTest: withEvent вызывается только когда вы касаетесь / прокручиваете / проводите / зажимаете ... где-то еще, а затем вызываете [self endEditing:YES]
.
Это лучше, чем использовать, touchesBegan
потому что touchesBegan
не вызывается, если вы нажмете кнопку в верхней части представления. Это лучше, чем тот, UITapGestureRecognizer
который не может распознать, например, жест прокрутки. Это также лучше, чем использование тусклого экрана, потому что в сложном и динамичном пользовательском интерфейсе нельзя ставить тусклый экран везде. Более того, он не блокирует другие действия, вам не нужно дважды нажимать, чтобы выбрать кнопку снаружи (как в случаеUIPopover
).
Кроме того, это лучше, чем звонить [textField resignFirstResponder]
, потому что у вас может быть много текстовых полей на экране, так что это работает для всех них.
Это должен быть самый простой способ скрыть клавиатуру, коснувшись снаружи:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
Если представление вообще встроено в UIScrollView
то вы можете использовать следующее:
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
Первый из них будет анимировать экранную клавиатуру при прокрутке таблицы, а второй - скрыть клавиатуру, как приложение «Стандартные сообщения».
Обратите внимание, что они доступны на iOS 7.0 или выше.
Вы можете сделать это, используя раскадровку в XCode 6 и выше:
Добавьте это в файл заголовка класса, используемого вашим ViewController:
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
Затем добавьте это в файл реализации того же ViewController:
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
Теперь это будет одно из «полученных действий» для вашей раскадровки (например, ViewController):
Теперь вам нужно подключить это действие к пользовательскому жесту касания клавиатуры.
Важно. Вам необходимо преобразовать UIView, который содержится в вашей раскадровке, в UIControl , чтобы он мог принимать события. Выберите представление в иерархии сцены View Controller:
... и измените его класс:
Теперь перетащите курсор из маленького кружка рядом с «полученным действием» для вашей сцены на «пустую» часть вашей сцены (фактически вы перетаскиваете «Полученное действие» в UIControl). Вам будет показан выбор событий, к которым вы можете подключить свое действие:
Выберите опцию «подправить изнутри». Теперь вы подключили созданный IBAction к пользовательскому действию касания клавиатуры. Когда пользователь нажимает на клавиатуру, она будет скрыта.
(ПРИМЕЧАНИЕ. Чтобы привязать действие к событию, вы также можете перетащить полученное действие непосредственно в UIControl в иерархии View Controllers. В иерархии оно отображается как «Control».)
Если я вас правильно понял, вы хотите уйти в отставку, нажав на кнопку вне, 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;
}
Просто чтобы добавить сюда список моей версии о том, как отклонить клавиатуру при внешнем прикосновении.
viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
Где угодно:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[textFieldName resignFirstResponder];
puts("Dismissed the keyboard");
}
Здесь вы найдете множество отличных ответов об использовании кнопки UITapGestureRecognizer
--all of break UITextField
(X). Решение состоит в том, чтобы подавить распознаватель жестов через его делегат:
- (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);
}
Это не самое надежное решение, но оно работает для меня.
return !touchViewIsButton
. Я предполагаю, что любые другие кнопки, которые должны отклонить клавиатуру, должны делать это в своих действиях. Кроме того, TouchUpInside может не вызываться при изменении раскладки при отклонении клавиатуры.
Вы можете создать категорию для 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
Быстрая версия ответа @ 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:"))
Я использовал пример Барри для моей новой разработки. Работало отлично! но я должен был включить небольшое изменение, необходимое для отклонения клавиатуры только для редактируемого текстового поля.
Итак, я добавил в пример Барри следующее:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
_textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
_textBeingEdited = nil;
}
Также я изменил метод hideKeyboard следующим образом:
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
//UITextField * tf = (UITextField *) sender;
[_textBeingEdited resignFirstResponder];
}
Один из самых простых и коротких способов - добавить этот код в свой viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(endEditing:)]];
Я попробовал многие ответы здесь, и мне не повезло. Мой распознаватель жестов касания всегда заставлял меня UIButtons
не отвечать при касании, даже когда я установилcancelsTouchesInView
свойство распознавателя жестов на НЕТ.
Вот что в итоге решило проблему:
Ивару:
UITapGestureRecognizer *_keyboardDismissGestureRecognizer;
Когда текстовое поле начинает редактирование, установите распознаватель жестов:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
if(_keyboardDismissGestureRecognizer == nil)
{
_keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)] autorelease];
_keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
}
}
Тогда дело в том, как настроить dismissKeyboard
метод:
- (void) dismissKeyboard
{
[self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}
- (void) dismissKeyboardSelector
{
[self.view endEditing:YES];
[self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
_keyboardDismissGestureRecognizer = nil;
}
Я полагаю, что есть что-то о том, как вывести dismissKeyboardSelector
выполнение из стека выполнения обработки касанием ...
Отправить сообщение resignFirstResponder
в текстовый файл, который поместил его туда. Пожалуйста, смотрите этот пост для получения дополнительной информации.
В этом примере aTextField является единственным UITextField .... Если есть другие или UITextViews, есть еще кое-что сделать.
// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end
// YourViewController.m
@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...
@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
// your other init code here
[self.view addGestureRecognizer:self.singleTapRecognizer];
{
- (UITapGestureRecognizer *)singleTapRecognizer
{
if (nil == _singleTapRecognizer) {
_singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
_singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
}
return _singleTapRecognizer;
}
// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
NSLog(@"singleTap");
[self hideKeyboard:sender];
}
// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
NSLog(@"Return pressed");
[self hideKeyboard:textField];
return YES;
}
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
[aTextField resignFirstResponder];
NSLog(@"keyboard hidden");
}
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleSingleTap:)];
[singleTapGestureRecognizer setNumberOfTapsRequired:1];
[singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];
[self.view addGestureRecognizer:singleTapGestureRecognizer];
}
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
[self.view endEditing:YES];
[textField resignFirstResponder];
[scrollView setContentOffset:CGPointMake(0, -40) animated:YES];
}
Добавьте этот код в ваш файл ViewController.m :
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
В этом случае можно использовать ScrollView и добавить его TextField
в ScrollView, и я хочу нажать ScrollView
и просмотреть, а затем закрыть клавиатуру. Я попытался создать пример кода на всякий случай. Нравится,
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
view.addGestureRecognizer(tapGesture)
// Do any additional setup after loading the view, typically from a nib.
}
func tap(gesture: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Ваш Раскадровка Посмотрите на это как.
Вы можете использовать метод UITapGestureRecongnizer для отклонения клавиатуры, щелкнув за пределами UITextField. При использовании этого метода всякий раз, когда пользователь нажимает за пределами UITextField, клавиатура получает отклонение. Ниже приведен фрагмент кода для его использования.
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}