文档章节

iOS开发4:关闭键盘

双子座
 双子座
发布于 2012/03/05 13:17
字数 789
阅读 12420
收藏 36

在 iOS 程序中当想要在文本框中输入数据,轻触文本框会打开键盘。对于 iPad 程序,其键盘有一个按钮可以用来关闭键盘,但是 iPhone 程序中的键盘却没有这样的按钮,不过我们可以采取一些方法关闭它。例如,我们可以实现按下 Rerun (有时也是 Done、Research 等)键关闭键盘,或者,更人性化的,轻触背景关闭键盘。

1、首先讲一下按下Return键关闭键盘。

当按下键盘的 Return 键,会产生一个 Did End On Exit 事件,此时,我们告诉文本框要放弃控件,于是键盘就消失了。

假设,我们已经创建了一个 Single View Application ,并打开 ViewController.xib 文件,在 View 上拖上去了三个 Text Field ,然后,我们把这三个文本框映射到 ViewController.h 中,名称依次是 firstField、secondField 以及 thirdField 。如下图:

在这个基础上,实现轻触 Return 关闭键盘,步骤为:

(1)在 ViewController.h 中声明一个方法:

- (IBAction)textFiledReturnEditing:(id)sender;

(2)在 ViewController.m 中实现这个方法:

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

所谓 First Responder 指的就是用户当前正在与之交互的控件。当用户使用键盘时,First Responder 就是这个键盘,resignFirstResponder 方法,顾名思义,就是放弃 First Responder 。

(3)让这三个文本框都映射到 textFiledReturnEditing 方法,不过此时的事件应当是 Did End On Exit ,具体操作是:

打开 Assistant Editor  ,左边打开 ViewController.xib ,右边打开 ViewController.h ,在 Xcode 最右边打开 Connector Inspector ,然后在 View 中选择第一个文本框,在 Connector Inspector 中找到 Did End On Exit ,从它右边的圆圈中拉出映射线,映射到 ViewController.h 的 textFiledReturnEditing 方法,如下图:

给其他两个文本框进行同样的操作。现在,已经实现了轻触 Return 键关闭键盘。

2、下面介绍更人性化的方法,轻触背景关闭键盘。

跟上面的步骤差不多,首先定义一个方法,然后实现这个方法,接下来将指定的控件映射到这个方法,并选择好所触发的事件。不同的是,这次我们要选择的控件不是上边的文本框,而是视图 View 本身。

(1)在 ViewController.h 文件中添加方法声明代码:

- (IBAction)backgroundTap:(id)sender;

(2)在ViewController.m中实现这个方法:

- (IBAction)backgroundTap:(id)sender {
    [firstField resignFirstResponder];
    [secondField resignFirstResponder];
    [thirdField resignFirstResponder];
}

需要说明的是,[firstField resignFirstResponder];表示,如果firstField有FirstResponder的话就放弃它,我们不用先判断firstField是否有,这条语句完全正确。

(3)让 View 映射到这个方法,不过事先,我们先要改变 View 的类型。

打开xib,选中 View ,打开 Identity Inspector ,在 class 中选择 UIControl :

(4)打开Assistant Editor ,左边打开 ViewController.xib ,右边打开 ViewController.h ,在Xcode最右边打开 Connector Inspector ,在 ViewController.xib 中选择 Control ,在 Connector Inspector 中找到 Touch Down ,从它右边的圆圈中拉出映射线,映射到 ViewController.h 的 backgroundTap 方法,如下图:

好了,可以运行下看看效果了:

     

打开键盘之后,在背景区域点击一下,键盘就会向下收起来。

 

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
加载中

评论(18)

Karlon
Karlon
很好很强大,谢谢楼主。
双子座
双子座 博主

引用来自“daisydan”的评论

那如果UIControl是处于最底层,就是在有其他控件在上层的地方是不是就没有效果的啊?

是的
daisydan
daisydan
那如果UIControl是处于最底层,就是在有其他控件在上层的地方是不是就没有效果的啊?
双子座
双子座 博主

引用来自“NextDj”的评论

self.view endEdit:YES试试这个方法取消键盘

学习了,顶你!
NextDj
NextDj
self.view endEdit:YES试试这个方法取消键盘
cos于鹏飞
cos于鹏飞
有两个问题想请教下楼主,关于segue界面切换时候的资源管理的问题

我在界面1放了一个按钮,功能是点下的时候使用segue(直接用右键拖动建立的连接)切换到界面2

问题1、当我在界面1按下切换的按钮,如何能让界面1的资源相应的释放?
我的尝试:我直接在切换按钮按下的时候写入了这样一句话:[self removeFromParentViewController];,发现依然不会执行到界面1的viewDidUnload方法;我又在模拟器模拟了内存不足的警告,依然没有收到界面1的viewDidUnload消息;而且如此操作多次,居然一直能正确的执行和返回,不解。。。。

问题2、界面2使用[self dismissModalViewControllerAnimated:YES];返回界面1的时候,我发现只调用了界面2的dealloc方法,没有执行界面2的viewDidUnload方法,然后我在界面1再点击切换按钮切换到界面2的时候,发现收到了界面2的viewDidLoad消息但是同样没有收到viewDidUnload消息,于是伴随着内存峰值增加了(多次测试后发现总值一直在上升,必定有内存没有释放),那么如何能是界面2调用到viewDidUnload消息?它都已经执行了dealloc了居然没有执行viewDidUnload,难道要我在dealloc的时候手动释放吗?
如此de想念将来
如此de想念将来
就是那个touchDown!
如此de想念将来
如此de想念将来

引用来自“双子座”的评论

引用来自“如此de想念将来”的评论

楼主点击背景区域键盘收起来!代码的方法怎么写啊!求指教

文章里不是写得很清楚吗

但是别人说有拖动使用IB不好饿!说不要用0.0。说使最好纯代码饿
双子座
双子座 博主

引用来自“如此de想念将来”的评论

楼主点击背景区域键盘收起来!代码的方法怎么写啊!求指教

文章里不是写得很清楚吗
如此de想念将来
如此de想念将来
楼主点击背景区域键盘收起来!代码的方法怎么写啊!求指教
使用 Xamarin 开发 iOS 键盘扩展(含网络访问)

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/...

walter lv
02/24
0
0
iOS 9应用开发教程之iOS 9新特性

iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统。该操作系统于2015年6月8号(美国时间)被发布。本章将主要讲解iOS 9的新特...

大学霸
2015/08/05
1K
0
响应式的 iOS 键盘组件 - RxKeyboard

RxKeyboard 是一个韩国人开发的响应式的 iOS 键盘组件,效果如下图所示: 示例代码: RxKeyboard 提供两种驱动方式: /// An observable keyboard frame.let frame: Driver<CGRect> /// An ...

匿名
06/05
306
0
WebApp与Native App的区别

WebApp与Native App的区别 Native App: 1、开发成本非常大。一般使用的开发语言为JAVA、C++、Objective-C。 2、更新体验较差、同时也比较麻烦。每一次发布新的版本,都需要做版本打包,且需...

一真的鱼
2018/07/03
79
1
互相“借鉴”这么多年 iOS 和 Android 抄法可不一样

科技界相爱相杀的例子不少,我们今天就来了聊聊其中的一对:iOS和Android。因为上周苹果正好发布了iOS 11,并且开放了开发者预览版,所以已经有不少人体验到了最新的iOS,而在这次的体验之后...

局长
2017/06/14
2.2K
15

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部