很多时候,我们需要关闭弹出的虚拟键盘,这里我们就讨论一下关闭键盘的多种方法。
原理解析
苹果官方文档中是这么描述的:
在用户进行了特定的操作的时候,可能需要将键盘隐藏。如果需要在点击键盘上的 return 按钮时隐藏,需要设置文本输入框的 delegate。为了隐藏按钮,需要向当前的第一响应者 (first responder) 发送 resignFirstResponder 消息。这样可以让该文本输入框结束当前的输入会话,并隐藏键盘。
那么问题的关键就是向第一响应者发送
resignFirstResponder
消息。[yourTextFieldName resignFirstResponder];
问题
但是问题来了,如果界面上有多个文本输入框怎么办,并不知道哪个输入框才是第一响应者。
方法一
最直观的方法就是给每一个文本输入框都发送
resignFirstResponder
消息。[self.yourTextField1 resignFirstResponder]; [self.yourTextField2 resignFirstResponder]; ... [self.yourTextFieldn resignFirstResponder];
方法二
当然,还有一种稍微聪明一些的方式,传入整个
view
:UIView *resignFirstResponder(UIView *theView) { if([theView isFirstResponder]) { [theView resignFirstResponder]; return theView; } for(UIView *subview in theView.subviews) { UIView *result = resignFirstResponder(subview); if(result) return result; } return nil; }
遍历传入的
view
的所有子视图,并发送 resignFirstResponder
消息。方法三
有没有相对优雅一点的方法呢。当然,下面的方法和方法二中提供的方法原理一致,不过有造好的轮子干嘛不用呢。
[self.view endEditing:YES];
是不是简洁明了多了!
键盘 return
键隐藏键盘
原理与上述方法一致,只是要求响应点击
return
键的事件。- 将 TextField 的 delegate 设置为实现
textFieldShouldReturn:(UITextField *)textField
方法的类(一般为相应的 ViewController)
- 遵循
UITextFieldDelegate
协议,并实现textFieldShouldReturn
方法: - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; }
点击空白处,隐藏键盘
有时我们需要在点击界面的空白处隐藏键盘,这是一个非常便利的操作。 这里我们的思路是,响应点击空白处的事件,并调用相应的
endEditing
方法。为了响应空白处的点击事件,需要将 xib
文件(或 stroyboard
)文件中响应的 View Class 改为 UIControl
,之后设定相关的 Target-Action 并实现相关的方法:- (IBAction)backgroundTapped:(id)sender { [self.view endEditing:YES]; }