iOS - 在UITextField外部触摸时关闭键盘
我想知道当用户触摸UITextField
之外时如何使键盘消失。
#1楼
检查一下,这将是最简单的方法,
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{[self.view endEditing:YES];// this will do the trick
}
要么
该库将处理包括滚动条自动滚动,点击空间以隐藏键盘等...
https://github.com/michaeltyson/TPKeyboardAvoiding
#2楼
只是在这里添加我的版本如何在外部触摸时解除键盘。
viewDidLoad中:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
任何地方:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{[textFieldName resignFirstResponder];puts("Dismissed the keyboard");
}
#3楼
我捣乱了几个答案。
使用在viewDidLoad:
期间初始化的ivar 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];
}
#4楼
如果我给你的权利,你要辞职键盘诡计敲击之外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楼
这有效
在这个例子中,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");
}
#6楼
我在这里尝试了很多回复,没有运气。 我的点击手势识别器总是导致我的UIButtons
在点击时没有响应,即使我将手势识别器的cancelsTouchesInView
属性设置为NO。
这最终解决了这个问题:
有一个伊娃:
UITapGestureRecognizer *_keyboardDismissGestureRecognizer;
当文本字段开始编辑时,设置手势识别器:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{if(_keyboardDismissGestureRecognizer == nil){_keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]initWithTarget:selfaction:@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
执行从触摸处理执行堆栈中删除...
#7楼
我用Barry的例子来说明我的新发展。 它工作得很好! 但我必须稍微改变,只需要为正在编辑的文本字段解除键盘。
所以,我向Barry添加了以下示例:
- (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];
}
#8楼
这里有很多关于使用UITapGestureRecognizer
的好答案 - 所有这些都打破了UITextField
的clear(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);
}
它不是最强大的解决方案,但它适用于我。
#9楼
- (void)viewDidLoad
{[super viewDidLoad]; UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:selfaction:@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];}
#10楼
如果视图完全嵌入在UIScrollView
那么您可以使用以下内容:
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
前者将在滚动表格视图时将键盘设置为关闭屏幕,后者将像股票消息应用程序一样隐藏键盘。
请注意,这些可在iOS 7.0或更高版本上使用。
#11楼
这是一个很好的通用解决方案:
Objective-C的:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {[self.view endEditing:YES];
}
迅速:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {self.view.endEditing(true)
}
基于@icodebuster解决方案: https ://stackoverflow.com/a/18756253/417652
#12楼
Swift版本,它与其他元素(如UIButton
或其他UITextField
)结合使用:
override func viewDidLoad() {super.viewDidLoad()let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))tapper.cancelsTouchesInView = falseview.addGestureRecognizer(tapper)
}
#13楼
最简单和最简短的方法之一是将此代码添加到viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self.viewaction:@selector(endEditing:)]];
#14楼
在ViewController.m文件中添加以下代码:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{[self.view endEditing:YES];
}
#15楼
您可以使用UITapGestureRecongnizer方法通过单击UITextField外部来解除键盘。 通过使用此方法,只要用户在UITextField外部单击,键盘就会被解除。 以下是使用它的代码段。
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:selfaction:@selector(dismissk)];[self.view addGestureRecognizer:tap];//Method
- (void) dismissk
{[abctextfield resignFirstResponder];[deftextfield resignFirstResponder];}
#16楼
您可以使用XCode 6及更高版本中的Storyboard执行此操作:
创建隐藏键盘的操作
将其添加到ViewController使用的类的头文件中:
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>- (IBAction)dissmissKeyboardOnTap:(id)sender;@end
然后将其添加到同一ViewController的实现文件中:
- (IBAction)dissmissKeyboardOnTap:(id)sender{[[self view]endEditing:YES];
}
这将是您的故事板场景(即ViewController)的“已接收操作”之一:
将操作连接到用户事件
现在,您需要将此操作连接到触摸键盘的用户手势。
重要 - 您需要将故事板中包含的'UIView'转换为UIControl ,以便它可以接收事件。 从View Controller Scene层次结构中选择视图:
...并改变它的类:
现在从场景的“已接收动作”旁边的小圆圈拖动到场景的“空”部分(实际上是将“已接收的动作”拖动到UIControl)。 您将看到一系列可以将您的操作连接到的事件:
选择“内部修饰”选项。 您现在已将您创建的IBAction挂钩到用户触摸键盘的操作。 当用户轻敲键盘时,它现在将被隐藏。
(注意:要将操作挂钩到事件,您还可以将接收到的操作直接拖到View Controllers层次结构中的UIControl上。它在层次结构中显示为“Control”。)
#17楼
您可以为UiView创建类别并覆盖touchesBegan meathod,如下所示。
它对我来说很好。它是这个问题的集中解决方案。
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{[self.window endEditing:true];[super touchesBegan:touches withEvent:event];
}
@end
#18楼
这必须是通过触摸外部隐藏键盘的最简单方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {[self.view endEditing:YES];
}
( 当用户点击文本字段外的其他区域时 , 如何关闭键盘? )
#19楼
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {if let touch = touches.first{view.endEditing(true)}
}
#20楼
Swift版@ 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:"))
#21楼
在这种情况下,可以使用ScrollView并添加到ScrollView中的TextField
,我想要点击ScrollView
和View然后关闭键盘。 为了以防万一,我尝试创建示例代码。 像这样,
import UIKitclass 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.}
}
你的故事板看看就像。
#22楼
在视图中设置文本字段委托加载:
override func viewDidLoad() { super.viewDidLoad() self.userText.delegate = self }
添加此功能:
func textFieldShouldReturn(userText: UITextField!) -> Bool { userText.resignFirstResponder() return true; }
#23楼
斯威夫特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 controllerfunc setupHideKeyboardOnTap() {self.view.addGestureRecognizer(self.endEditingRecognizer())self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())}/// Dismisses the keyboard from self.viewprivate func endEditingRecognizer() -> UIGestureRecognizer {let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))tap.cancelsTouchesInView = falsereturn tap}
}
#24楼
Swift 4 oneliner
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
#25楼
将消息resignFirstResponder
发送到将其放在那里的文本文件。 有关更多信息,请参阅此帖子 。
#26楼
您需要添加一个UITapGestureRecogniser
并将其分配给视图,然后在其选择器上的UITextField
上调用resign first responder。
代码:
在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
func dismissKeyboard (_ sender: UITapGestureRecognizer) {aTextField.resignFirstResponder()
}
#27楼
最好让你的UIView
成为UIControl
一个实例(在界面构建器中),然后将他们的TouchUpInside
事件连接到dismissKeyboard
方法。 这个IBAction
方法看起来像:
- (IBAction)dismissKeyboard:(id)sender {[aTextBox resignFirstResponder];
}
#28楼
怎么样:我知道这是一个老帖子。 它可能有助于某人:)
- (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];}} }
}
#29楼
我认为最简单(也是最好)的方法是子类化全局视图并使用hitTest:withEvent
方法来监听任何触摸。 键盘上的触摸没有注册,所以只有在触摸/滚动/滑动/捏合...其他地方时调用hitTest:withEvent,然后调用[self endEditing:YES]
。
这比使用touchesBegan
更好touchesBegan
因为如果单击视图顶部的按钮,则不会调用touchesBegan
。 它比UITapGestureRecognizer
更好, UITapGestureRecognizer
,它无法识别滚动手势。 它也比使用昏暗的屏幕更好,因为在复杂和动态的用户界面中,你无法在任何地方放置昏暗的屏幕。 此外,它不会阻止其他操作,您不需要点击两次来选择外部按钮(如UIPopover
的情况)。
此外,它比调用[textField resignFirstResponder]
更好,因为屏幕上可能有许多文本字段,因此这适用于所有这些字段。
#30楼
我看到有些人在使用UITapGestureRecognizer
方法时遇到问题。 我完成此功能的最简单方法是在保持现有按钮的点击行为不变的情况下,只添加一行@ Jensen2k的答案:
[tap setCancelsTouchesInView:NO];
这允许我现有的按钮仍然可以工作而不使用@Dmitry Sitnikov的方法。
在这里阅读该property
(搜索CancelsTouchesInView
): UIGestureRecognizer类参考
我不确定它如何与滚动条一起使用,因为我看到有些问题,但希望其他人可能遇到我所拥有的相同情况。
iOS - 在UITextField外部触摸时关闭键盘相关推荐
- objective-c的TextFields输入完成后关闭键盘和触摸背景关闭键盘
首先输入完成后按键盘上的done关闭键盘 首先在Interface Builder中选择TextFields,然后在Text Field Attributes中找到Text Input Traits, ...
- ios键盘done中文_IOS_IOS关闭键盘的方法,首先输入完成后按键盘上的done - phpStudy...
IOS关闭键盘的方法 首先输入完成后按键盘上的done关闭键盘 首先在Interface Builder中选择TextFields,然后在Text Field Attributes中找到Text In ...
- java android对话框_java - 防止Android活动对话框关闭外部触摸
18个解决方案 327 votes 要防止对话框在按下后退键时被解除,请使用此选项 dialog.setCancelable(false); 并且为防止对话框在外部触摸时被解雇,请使用此功能 dial ...
- ios 开发 键盘 android,UiOS开发中ITextView回收或关闭键盘使用方法总结
iOS开发中,发现UITextView没有像UITextField中textFieldShouldReturn:这样的方法,那么要实现UITextView关闭键盘,就必须使用其他的方法,下面是可以使用 ...
- ios关闭键盘首字母大写
autocapitalize="off" 在iOS中,当虚拟键盘弹出时,默认状况下键盘是开启首字母大写的功能的,根据某些业务场景,可能咱们须要关闭这个功能,移动版本webkit为i ...
- 笔记本电脑键盘触摸板关闭_如何更换笔记本电脑的键盘或触摸板
笔记本电脑键盘触摸板关闭 Barring any kind of accidental damage, your laptop's keyboard and touchpad are the part ...
- IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘
*********用户登录,回车的监听(代理模式UITextFieldDelegate) #import "HMViewController.h" @interface HMVie ...
- IOS 在低版本上,输入密码时,键盘上方保存密码组件不断的闪烁问题
IOS 在低版本上,输入密码时,键盘上方保存密码组件不断的闪烁问题 在开发APP的时候,遇到一个这样的问题,在输入密码的时候,由于IOS有个保存密码的组件,在你输入的时候,它会去调去是否保存过密码的一 ...
- Android开发之点击输入法外部关闭键盘点击输入法外部关闭输入法的解决方法
在此做个笔记,防止遗忘,可能以后有需要. 先看下效果图 先讲解下思路: 首先在actviity里面获取到当前获取焦点的控件,判断当前控件是不是输入法弹起的那个EditText,然后再Activity的 ...
最新文章
- 深思:如何堂堂正正的做事
- 成功解决\h5py\__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float
- JDK5的一些新特性
- 7-9 设计一个能处理异常的Loan类 (20 分)
- Kotlin学习笔记(3)- 语法
- 梳子刻字刻什么好_校园石阶上被人刻了1700多个字?!这次网友却说好
- 【通信仿真】基于matlab V-BLAST结构检测算法仿真【含Matlab源码 1683期】
- 微信浏览器真不愧移动届ie啊
- 乐橙机器人的价格_乐橙育儿机器人app-大华乐橙机器人app(乐橙宝宝)下载V1.00.001-西西软件下载...
- Python小白的数学建模课-20.网络流优化案例
- android studio : amend commit
- 如何点亮QQ邮箱图标 - 龙 炫家族特权
- windows资源管理器经常出现无响应 window语言栏不见了
- Hadoop系列之什么是Hadoop(1)
- CNCC“智能+引领社会发展”大会总结
- stable diffusion文字转图片(教程)
- Java实现基于国密SM2、SM4生成证书密钥进行字串的加解密
- html调用一言api,「许巍定制」自建 Typecho/WordPress 一言API本地服务并调用
- Excel——快速插入、删除行和列
- 平面几何-python
热门文章
- Android 面试题目之 关于AbstractQueuedSynchronizer的注解翻译
- Java 正则表达式源码解析
- Android面试闯关——Activity(持续更新中)
- byte[]数组和int之间的转换
- Android View绘制之旅
- uniapp中动态添加及修改导航栏
- 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】
- Java锁优化思路及JVM实现
- NET仿微信Oauth2.0
- jquery点击元素之外触发事件