UITextField
之外的区域时,键盘自动消失。UITextField
之外的区域时,键盘自动消失。UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
In 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];
,它不需要引用文本字段,并且适用于多个文本字段。 - Julian[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
。 - Subhas[tap setCancelsTouchesInView:NO];
,这是根据 @qiaoyi 的建议;我曾经遇到一个表格没有响应行选择的问题。五年后,希望这能帮助其他人解决类似问题。 - Tom Howardself.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
- Malfunction我把几个答案搭配起来了。
在viewDidLoad:
期间初始化一个实例变量(ivar)。
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 Class Reference
我不确定它如何与滚动条一起工作,因为我看到有些人遇到了问题,但希望其他人也可能遇到我遇到的相同情况。
UIImageView
的人,请添加 [imageView setUserInteractionEnabled:NO];
并且您可以“穿透”它,这样就可以使该方法起作用。 - Paul Peelen更好的方法是将您的 UIView
实例化为 UIControl
(在界面构建器中),然后将它们的 TouchUpInside
事件连接到 dismissKeyboard
方法。这个 IBAction
方法看起来像:
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
干扰了视图内部按钮的点击)。touchesEnded
无法工作,因为有一个UIScrollView
干扰了响应链。 - jlstreckerSwift 4
在viewDidLoad
中使用以下扩展方法来设置您的UIViewController
:
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
。 - Bhavin Bhadanic#
代码。FYI那个分号是语法允许的,只是不必要的。 - Rob这样怎么样:我知道这是一篇旧帖子,但它可能会对某些人有所帮助 :)
- (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];
}
迅捷:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
基于 @icodebuster 的解决方案:https://dev59.com/TWMl5IYBdhLWcg3wBzDy#18756253
Swift 4 单行代码
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))