热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

iOS关闭虚拟键盘方法汇总

在iOS应用开发中,有三类视图对象会打开虚拟键盘,进行输入操作,但如何关闭虚拟键盘,却没有提供自动化的方法

在iOS应用开发中,有三类视图对象会打开虚拟键盘,进行输入操作,但如何关闭虚拟键盘,却没有提供自动化的方法。这个需要我们自己去实现。这三类视图对象分别是UITextField,UITextView和UISearchBar。 这里介绍一下UITextField中关闭虚拟键盘的几种方法。

第一种方法,使用它的委托UITextFieldDelegate中的方法textFieldShouldReturn:来关闭虚拟键盘。

在UITextField视图对象如birdNameInput所在的类中实现这个方法。

(BOOL)textFieldShouldReturn:(UITextField *)textField { 
if ((textField == self.birdNameInput) || (textField == self.locationInput)) { 
[textField resignFirstResponder]; 
} 
return YES; 
} 
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ((textField == self.birdNameInput) || (textField == self.locationInput)) {
[textField resignFirstResponder];
}
return YES;
}

这样,在输入框birdNameInput中打开虚拟键盘后,轻击键盘的return键就会自动关闭掉虚拟键盘。

第二种方法,将birdNameInput的属性中Return Key修改为done,再定义一个方法和Done键的Did End On Exit连接。

通过轻击done键触发这个事件来关闭虚拟键盘。

定义的方法如下:

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

这两个方法都是轻击虚拟键盘上一个键来关闭它。这属于精确操作,而手指不像鼠标,做这种操作不容易。因此就UI层面而言,这两个方法都不是最好的方法。 在iphone或ipad屏幕上,虚拟键盘占用的面积大小是有限的。通过轻击虚拟键盘之外的区域而关闭虚拟键盘。

第三种方法,通过轻击键盘之外的空白区域关闭虚拟键盘。

在birdNameInput所属的视图控制器类的viewDidLoad方法中定义一个UITapGestureRecognizer的对象,然后将它赋值为它的视图。

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

再定义一下选择器调用的方法dismissKeyboard。

(void)dismissKeyboard { 
[birdNameInput resignFirstResponder]; 
} 
-(void)dismissKeyboard {
[birdNameInput resignFirstResponder];
}

如果屏幕上有多个textField的话,一个一个地列出来就有些麻烦。那么将方法修改一下,如下:

(void)dismissKeyboard { 
NSArray *subviews = [self.view subviews]; 
for (id objInput in subviews) { 
if ([objInput isKindOfClass:[UITextField class]]) { 
UITextField *theTextField = objInput; 
if ([objInput isFirstResponder]) { 
[theTextField resignFirstResponder]; 
} 
} 
} 
} 
-(void)dismissKeyboard {
NSArray *subviews = [self.view subviews];
for (id objInput in subviews) {
if ([objInput isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objInput;
if ([objInput isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}

如果这个屏幕上的视图对象很复杂的话,另当别论。 这个方法是编码新建一个手势对象。也可以直接使用interface builder图形化开发工具,在storyboard中拉入一个手势对象到视图控制器类中,再将此手势对象建立一个IBACTION,名称可以是dismissKeyboard。

第四种方法,通过轻击键盘之外的空白区域关闭虚拟键盘。

将屏幕上的view也就是textField的父视图拖一个touch down事件出来,和一个能关闭虚拟键盘的方法连接。如果视图没有touch down事件,可将view的父类从UIView修改为UIButton。 首先定义并实现一个方法backgroundTap:。

(IBAction) backgroundTap:(id)sender 
{ 
NSArray *subviews = [self.view subviews]; 
for (id objInput in subviews) { 
if ([objInput isKindOfClass:[UITextField class]]) { 
UITextField *theTextField = objInput; 
if ([objInput isFirstResponder]) { 
[theTextField resignFirstResponder]; 
} 
} 
} 
} 
- (IBAction) backgroundTap:(id)sender
{
NSArray *subviews = [self.view subviews];
for (id objInput in subviews) {
if ([objInput isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objInput;
if ([objInput isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}

然后选择背景视图的Touch Down事件,连接 backgroundTap:即可。这样只要轻击一下虚拟键盘之外的区域,就能关闭虚拟键盘。这些方法都是使用resignFirstResponder方法来关闭虚拟键盘,还有其他的方法。

第五种方法,使用endEditing:方法 在所在的视图控制器类中,覆盖这个方法

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

This method looks at the current view and its subview hierarchy for the text field that is currently the first responder. If it finds one, it asks that text field to resign as first responder. If the force parameter is set to YES, the text field is never even asked; it is forced to resign.

但是,如果这个屏幕很复杂,虚拟键盘之外的区域中有很多按钮。轻击这些区域时可能会轻击到这些按钮,这样虚拟键盘就不能关闭。

要是找到一个没有按钮的空白区域都不容易且还有隐藏的视图对象时,通过轻击虚拟键盘之外的区域关闭虚拟键盘的方法实现起来就难了。

第六种方法,覆盖hitTest:withEvent:方法关闭虚拟键盘

在stackoverflow.com上,有人这样总结。说使用hitTest:withEvent:方法是最好的,也是最容易的解决方法。

I think the easiest (and best) way to do this is to subclass your global view and use hitTest:withEvent method to listen to any touch. Touches on keyboard aren't registered, so hitTest:withEvent is only called when you touch/scroll/swipe/pinch... somewhere else, then call [self endEditing:YES]. This is better than using touchesBegan because touchesBegan are not called if you click on a button on top of the view. It is better than UITapGestureRecognizer which can't recognize a scrolling gesture for example. It is also better than using a dim screen because in a complexe and dynamic user interface, you can't put dim screen every where. Moreover, it doesn't block other actions, you don't need to tap twice to select a button outside (like in the case of a UIPopover). Also, it's better than calling [textField resignFirstResponder], because you may have many text fields on screen, so this works for all of them.

因此,我再建立一个继承UIView的视图类。在这个视图类中,覆盖hitTest:withEvent:方法,增加[self endEditing:YES]方法。

(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
UIView *result = [super hitTest:point withEvent:event]; 
[self endEditing:YES] 
return result; 
} 
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *result = [super hitTest:point withEvent:event];
[self endEditing:YES]
return result;
}

我将视图控制器的主视图所属类修改为这个新建视图类。这样在屏幕上轻击任何位置都会关闭虚拟键盘。 这个方法是最简单,也是最好的关闭虚拟键盘的方法。 使用好hitTest:withEvent:这个方法,还可以实现很多很复杂的功能。

The implementation of hitTest:withEvent: in UIResponder does the following:

• It calls pointInside:withEvent: of self
• If the return is NO, hitTest:withEvent: returns nil. the end of the story.
• If the return is YES, it sends hitTest:withEvent: messages to its subviews. it starts from the top-level subview, and continues to other views until a subview returns a non-nil object, or all subviews receive the message.
• If a subview returns a non-nil object in the first time, the first hitTest:withEvent: returns that object. the end of the story.
• If no subview returns a non-nil object, the first hitTest:withEvent: returns self
This process repeats recursively, so normally the leaf view of the view hierarchy is returned eventually. However, you might override hitTest:withEvent to do something differently. In many cases, overriding pointInside:withEvent: is simpler and still provides enough options to tweak event handling in your application.

以上给大家介绍了六种iOS关闭虚拟键盘的方法,大家可以根据个人需要选择一种适合自己比较好的方法。同时也非常感谢大家对网站的支持!


推荐阅读
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 我一直都有记录信息的习惯,不知是从什么时候开始,大约是在工作后不久。如今还真有点庆幸从那时开始记了点东西,当然是电子版的,写 ... [详细]
  • 1.webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用(1) ... [详细]
  • 爱奇艺如何使用扫码登录二维码
    本文介绍了在使用爱奇艺时如何通过扫码登录二维码的具体操作方法,包括打开爱奇艺app、点击“我的”按钮、点击扫码按钮等步骤。同时提供了操作环境的相关信息,包括手机品牌型号、系统版本和软件版本。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 苹果手机home键设置1.我们点击打开iPhone手机桌面上的设置图标。2.点击打开页面中的通用选项。 ... [详细]
  • 当google在搜索上很成功,并购youtube、发布gmail、进入手机、一统地图的时候,我们说google真伟大。当苹果在mp3领域一骑绝尘,iphone秒杀诺基亚,ipad打倒了电子 ... [详细]
  • 苹果iPhone性能模式怎么开启_苹果开启iPhone电池性能优先功能方法一览
    苹果iphone性能模式怎么开启?相信很多用户对于这个功能还不是很清楚,那么iphone电池性能优先功能在哪里呢?下面小编为大家带来苹果开启iPhone电池性能优先功能方法一览,需 ... [详细]
  • iphone充着电反而掉电
    iphone一边充电还一边掉电的原因可能是充电的电压不够、充电器或数据线不是原装的、充电环境的温度过低、充电头用久了老化或者是接口脏了、手机软硬件出现问题等等。建议先把手机进行重启 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • Myappcrashedandthecodeisthefollowing:我的应用程序崩溃,代码如下:elseif(){CGDetailVie ... [详细]
  • Xcode离线安装帮助文档1.在线查看帮助文件:Xcode下查看帮助文件,菜单Help-DeveloperDocumentation在右上角搜索框中即可检索,但速度很慢 ... [详细]
  • 抖音别人的文案标题怎么复制
    复制别人的抖音文案标题操作如下:1、打开抖音app,选择需要复制文案的视频,点击右侧箭头即可弹出分享框。2、在分享框中,点击复制链接”,即可将视频链接复制成功。3、在输入框中,选择 ... [详细]
author-avatar
mobiledu2502861763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有