http://www.jianshu.com/p/9717b792599c   是原文地址

处理关闭键盘的做法一般分为两种:1.放弃第一响应者身份;2.当前视图结束编辑。通常情况下只要我们在合适的时机去做这两件事的任意一种,都会很稳妥的如我们所愿----关闭键盘。但是,总有那么一些特殊情况使我们不能如意的关闭键盘,比如:在tableviewcell上有一个textfiled或者textview时,我们想要点击背部空白关闭键盘时确不能如愿。现在,我们一步一步的来解决这个问题,首先我们创建一个这样的界面:

 

我们在要点击屏幕空白处收起键盘最常见的处理方法是在刚点击的方法中放弃第一响应者身份或者结束编辑,如图

 

但是运行后发现这个方法不执行,于是我们最常用的而且一用就成功的方法遭遇了tableview这个刺儿头就不灵了。按照我们的理解,只要我们与界面有任何交互运动,touchsBegan的方法就一定会执行,但是我们在这里打断点显示却是没有执行,这是为什么呢?一般在viewController中实现这个方法,点击背景时,这个方法就会执行,于是在tableviewController我们也潜移默化的认为tableviewController下的tableview也会执行这个方法,其实不然,因为tableviewController也是由viewController封装而成,所以真正执行touchsBegan的还是这个viewController下的view。

好了,既然这样不行,那我们就给tableview加个tap手势吧,代码如下:

 

然后我们再次运行程序看看效果。。。。好嘞,终于键盘如愿关闭了,需求解决,不用加班了,于是收拾书包准备回家呗。。。可是产品wang的声音在你即将双脚跨出办公室门外的0.0001秒之前将你叫了回来:“怎么点击cell不能跳转了,还有删除cell也删除不了了?” 于是原本欣喜的心情瞬间如一万头草泥马在心头奔腾而过,回家的愿望破灭了,放下书包继续撸代码。。。。(tap手势覆盖了tableview里面自带的手势,于是就不执行didselect...的方法)

现在就利用响应链机制来解决这个问题,事件响应链机制我就不在这儿细说了,官方资料讲的很明白了,主要就是查找事件源(调用hitTest...查找)和反馈给系统处理(调用.nextResponse),所以现在我们只需在点击tableview的事件反馈给appdelegate处理之前关闭键盘就可以了,这样既关闭了键盘,又不会由于覆盖tableview封装的手势而导致cell的手势操作异常问题。方法步骤如下:

1.由于我是用storyboard创建的界面,所以先创建一个继承自UItableview的类,然后与storyboard里面tableview关联。(纯代码一样)

2.在这个类中实现hitText...的方法如下所示:

 

这段代码的意思就是点击的是tableview就结束编辑并且返回tableview本身,这样就不影响了tableview本身的操作,然后点击的是tableview的子视图的时候就返回子视图就行了。

好了,再次运行程序,十指飞快的测试,bingo没问题,背上书包光年速度飞奔回家!

文/麦克学会了摇滚(简书作者)
原文链接:http://www.jianshu.com/p/9717b792599c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS利用响应链机制点击tableview空白处关闭键盘-可以作为参考的更多相关文章

  1. iOS开发经验——点击屏幕空白处退出键盘

          一种比较简单的点击屏幕空白处退出键盘的方法: 在ViewController中加入如下代码: 1: -(void)touchesBegan:(NSSet *)touches withEve ...

  2. iOS事件响应链(Responder Chain)

    概述 在iOS中,视图的层级一般都是 父视图->添加各种子视图.这时候某个视图(子视图)上有个按钮,需要我们交互.但是有时候我们会发现无论如何都没有反应.这时候可能就是我们对iOS的事件传递响应 ...

  3. iOS事件响应链

    首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获 ...

  4. iOS 响应链

    一.UIResponder app 使用响应者对象接收和处理事件,只有继承 UIResponder 的类,才能处理事件. UIApplication.UIView.UIViewController 都 ...

  5. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  6. IOS Swift UITableViewcontroller实现点击空白处隐藏键盘

    在ios开发中,为了方便,我们经常使用UITableViewcontroller,比如搜索界面为了方便可能更多的使用UITableViewcontroller,那么问题就来了,当我点击搜索框的时候会弹 ...

  7. AJ学IOS(18)UI之QQ聊天布局_键盘通知实现自动弹出隐藏_自动回复

    AJ分享,必须精品 先看图片 第一步完成tableView和Cell的架子的图 完善图片 键盘弹出设置后图片: 自动回复图: 粗狂的架子 tableView和Cell的创建 首相tableView为了 ...

  8. swift3.0 点击UIScrollView中输入框之外的区域关闭键盘

    通过点击事件实现关闭键盘 scrollView: UIScrollView! title_textField: UITextField! let hideKeyboardTapGesture = UI ...

  9. iOS开发事件分发机制—响应链—手势影响

    1.提纲 什么是iOS的事件分发机制 ? 一个事件UIEvent又是如何响应的? 手势对于响应链有何影响? 2.事件分发机制 2.1.来源 以直接触摸事件为例: 当用户一个手指触摸屏幕是会生成一个UI ...

随机推荐

  1. 用if做了一个简单的猜拳游戏(做的不好还请指点,谢谢!)

    #include "stdio.h" #include "stdlib.h" #include "time.h" //随机函数的头文件 ma ...

  2. winform Execl数据 导入到数据库(SQL) 分类: WinForm C# 2014-05-09 20:52 191人阅读 评论(0) 收藏

    首先,看一下我的窗体设计: 要插入的Excel表: 编码 名称 联系人 电话 省市 备注 100 100线 张三 12345678910 北京 测试 101 101线 张三 12345678910 上 ...

  3. TPL中的task并不是thread

    Tasks are not Threads - The Brain Dump用了一个非常简单直观的例子说明了task和thread并不是一回事(尽管你调用Task.Run一般会在线程池上启一个线程帮你 ...

  4. java.lang包

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.特性——不用import 2.String String x = "abc"; < ...

  5. cocos2d-x3.0 ListView

    .h #include "cocos2d.h" #include "cocos-ext.h" #include "ui/CocosGUI.h" ...

  6. 基于amoeba实现mysql数据库的读写分离/负载均衡

    一.Amoeba的简述:[来自百度百科]      Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请 ...

  7. [PWA] Keynote: Progressive Web Apps across all frameworks

    PWA: Add to home screen Angular Universal Server side rendering: for achieving better proference on ...

  8. [RxJS] Filtering operator: filter

    This lesson introduces filter: an operator that allows us to let only certain events pass, while ign ...

  9. Qt 学习之路 :信号槽

    信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...

  10. 我开启httpd服务的时候 显示Could not reliably determine the server`s fully qualified domain name,

    vi /etc/httpd/conf/httpd.conf加入一句 ServerName localhost:80