iOS学习通往财富自由之路iOS开发

响应者链浅谈

2016-07-13  本文已影响221人  阿拉当

响应者对象

响应者对象(Response object) 响应者对象就是可以响应事件并对事件作出处理。iOS中UIResponder类,定义了响应者对象的所有方法。UIApplication、UIView等类都继承了UIResponder类,UIWindow和UIKit框架下的控件,因为继承了UIView,所以也属于响应者类

第一响应者

当前接受触摸的响应者对象,它是响应者链的开端。事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方。事件将沿着响应者链一直向下传递,直到被接受并做出处理。

响应者链

响应者链表示一系列的响应者对象。事件交由第一响应者对象处理,如果第一响应者对象不处理,事件被沿着响应者链向上传递,交给下一个响应者(next responder)。

事件传递的过程

响应者链的传递过程

响应者链传递图

First Responser -- > The Window -- >The Application -- > App Delegate

不能响应的几种情况

发生触摸事件后,系统会将该事件加入UIApplication管理的事件队列中。UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序主窗口。触摸事件通过父控件传递到子控件。
例如有1->2->3->4->5这么几层View,点击事件需要通过UIApplication传给UIWindow,然后向子控件传递。
如果父控件拒绝接收事件,那么点击子控件是无效的。
如果传递链在中间断开,则会交给断点前的控制器处理。
例如3->4处损坏,点击5会由3处理,如果5拒绝接收,会由4处理。
图片默认的userInteractionEnabled为NO,默认不接收事件,因此不会遮盖下面的视图接收触摸事件。
以后发现按钮不管用,检查父控件是否userInterationEnabled为YES,例如图片上的按钮。
imageView的响应为YES,会把事件回抛到父控件(响应者链条)。
事件顺着响应者链条向上传递,找到最合适的控件调用touches....方法。
可以实现事件的回传。
1->2->3 三层
如果要实现2、3都监听触摸,调用3的super的touches...方法即可。

补充:如果经过上面的传播过程,还没有被处理,那么该事件就会被丢弃。
(从网上看了一些自己总结整理了一些,不是很全有待补充)

上一篇下一篇

猜你喜欢

热点阅读