iOS – 在触摸UITextField外部时closures键盘

我想知道如何让用户在UITextField之外触摸时使键盘消失。

您需要添加一个UITapGestureRecogniser并将其分配给该视图,然后调用它的select器上的UITextField上的第一个响应者。

代码:

在viewDidLoad中

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

在closures键盘:

 -(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() } 

我find了一些答案。

使用在viewDidLoad期间被初始化的伊娃:

 UIGestureRecognizer *tapper; - (void)viewDidLoad { [super viewDidLoad]; tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; tapper.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tapper]; } 

closures正在编辑的内容:

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

检查一下,这将是最简单的方法来做到这一点,

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self.view endEditing:YES];// this will do the trick } 

要么

这个库将处理包括滚动条自动滚动,点击空间隐藏键盘等…

https://github.com/michaeltyson/TPKeyboardAvoiding

我发现有些人在使用UITapGestureRecognizer方法时遇到了问题。 我已经完成了这个function,同时仍然保持现有button的抽头行为不变的最简单的方法是只添加一行到@ Jensen2k的答案:

 [tap setCancelsTouchesInView:NO]; 

这使我现有的button仍然工作,而不使用@Dmitry Sitnikov的方法。

在这里阅读有关该属性(search“CancelsTouchesInView”): UIGestureRecognizer类参考

我不确定它是如何与滚动条一起工作的,因为我看到有些问题,但是希望其他人可能遇到同样的情况。

最好将UIView作为UIControl的一个实例(在界面生成器中),然后将其“Touch Up Inside”事件连接到dismissKeyboard方法。 这个IBAction方法如下所示:

 - (IBAction)dismissKeyboard:(id)sender { [aTextBox resignFirstResponder]; } 

Swift版本,这与其他元素(如UIButton或另一个UITextField )结合使用:

 override func viewDidLoad() { super.viewDidLoad() let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing)) tapper.cancelsTouchesInView = false view.addGestureRecognizer(tapper) } 

这个怎么样:我知道这是一个老post。 它可能有助于某人:)

 -(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]; } } } } 

这是一个很好的通用解决scheme:

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解决scheme: https ://stackoverflow.com/a/18756253/417652

我认为做到这一点最简单(也是最好)的方法是将你的全局视图子类化,并使用hitTest:withEvent方法来听取任何联系。 在键盘上的触摸没有注册,所以hitTest:withEvent只有当你触摸/滚动/刷卡/捏…只要调用其他地方,然后调用[self endEditing:YES]。

这比使用touchesBegan更好,因为如果您单击视图顶部的button,则不会调用touchesBegan。 它比UITapGestureRecognizer更好,它无法识别滚动手势。 这比使用昏暗的屏幕更好,因为在一个复杂的和dynamic的用户界面,你不能放在每个地方昏暗的屏幕。 此外,它不会阻止其他操作,您不需要点击两次来select外部button(例如在UIPopover的情况下)。

另外,它比调用[textField resignFirstResponder]要好,因为在屏幕上可能有很多文本字段,所以这对所有的人都适用。

这一定是触摸外面隐藏键盘最简单的方法:

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

( 当用户点击文本框外的其他区域时如何closures键盘?

如果我有你的权利,你想要辞职键盘wile轻敲文本框的正面,但是你没有参考你的textfield框。

尝试这个;

  • 取全局reftextField ,我们称之为reftextField
  • 现在在textFieldDidBeginEditing设置引用文本字段为

     - (void) textFieldDidBeginEditing:(UITextField *)textField{ reftextField = textField; } 
  • 现在你可以愉快地使用任何button时钟,(开始编辑推荐添加一个透明的button)

     - (void)dismissKeyboard { [reftextField resignFirstResponder]; } 
  • 或者为了完成button尝试这个。

     //for resigning on done button - (BOOL) textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; return YES; } 

您可以使用XCode 6及更高版本中的Storyboard来执行此操作:

创build操作来隐藏键盘

把它添加到你的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层次结构中select视图:

在这里输入图像说明

…并改变它的类:

在这里输入图像说明

现在从您的场景的“接收动作”旁边的小圆圈拖动到场景的“空白”部分(实际上是将“接收的动作”拖动到UIControl中)。 你会看到一系列的事件,你可以把你的动作连接到:

在这里输入图像说明

select“触摸里面”选项。 现在,您已将所创build的IBAction挂接到触摸键盘的用户操作。 当用户点击键盘时,现在将被隐藏。

(注意:要将操作挂钩到事件,您也可以将接收到的操作直接拖到View Controller层次结构中的UIControl中,在层次结构中显示为“Control”。

您可以使用UITapGestureRecongnizer方法通过单击UITextField外部来closures键盘。 通过使用这种方法,每当用户将点击UITextField之外,那么键盘将被解雇。 以下是使用它的代码片段。

  UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissk)]; [self.view addGestureRecognizer:tap]; //Method - (void) dismissk { [abctextfield resignFirstResponder]; [deftextfield resignFirstResponder]; } 

只是在这里添加我的版本,如何在外部触摸解雇一个键盘。

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的很好的答案 – 所有这些都打破了UITextField的清除(X)button。 解决scheme是通过它的委托来抑制手势识别器:

 - (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); } 

这不是最强大的解决scheme,但它适用于我。

如果视图完全embedded到UIScrollView则可以使用以下方法:

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

前者会在桌面视图滚动时将屏幕上的键盘设置为屏幕animation,而后者将隐藏键盘,就像股票消息应用程序一样。

请注意,这些都可以在iOS 7.0或更高版本上使用。

您可以创buildUiView的类别并覆盖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 

@ Jensen2k的快速版答案:

 let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard") self.addGestureRecognizer(gestureRecognizer) func dismissKeyboard() { aTextField.resignFristResponder() } 

一个class轮

 self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:")) 

我用巴里的例子来说明我的新发展。 它工作得很好! 但是我不得不稍微改变一下,只有在被编辑的文本字段时才需要closures键盘。

所以,我给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]; } 

最简单和最简单的方法之一是将此代码添加到您的viewDidLoad

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

将消息resignFirstResponder发送到放在那里的文本文件。 请看这个post了解更多信息。

这工作

在这个例子中,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"); } 

我在这里尝试了很多回应,没有运气。 我的水龙头手势识别器总是导致我的UIButtons在点击时不响应,即使我将手势识别器的cancelsTouchesInView属性设置为NO。

这是什么最终解决了这个问题:

有一个伊娃:

 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执行从触摸处理执行堆栈执行…

 - (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]; } 
 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { if let touch = touches.first{ view.endEditing(true) } } 

在这种情况下,可以使用ScrollView并将其添加到ScrollView中的TextField ,然后点击ScrollView和View然后closures键盘。 我试图创build示例代码以防万一。 喜欢这个,

 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. } } 

你的故事板看起来就像。

在这里输入图像说明

  • 设置文本字段委托在视图中加载:

     override func viewDidLoad() { super.viewDidLoad() self.userText.delegate = self } 
  • 添加这个function:

     func textFieldShouldReturn(userText: UITextField!) -> Bool { userText.resignFirstResponder() return true; } 

对于那些在Swift中挣扎的人。 这是Jensen2k公认的答案,但在Swift中。

Swift 2.3

  override func viewDidLoad() { //..... let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:))) //this line is important viewTapGestureRec.cancelsTouchesInView = false self.view.addGestureRecognizer(viewTapGestureRec) //..... } func handleViewTap(recognizer: UIGestureRecognizer) { myTextField.resignFirstResponder() } 

只需在.m文件中使用此代码,当用户轻敲文本字段外时,将会退出文本字段。

  -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [textfield resignFirstResponder]; }