事件传递和响应者链条

来源:互联网 发布:手游淘宝代充便宜原因 编辑:程序博客网 时间:2024/05/17 04:02

一、事件传递:
<1当对象发生触摸事件以后,系统会将该事件加入到一个由UIApplication管理的事件队列中。
<2UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)
<3主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,但是这仅仅是整个事件处理过程的第一步。
<4找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理

之前的文章我说过UIView在接收到触摸时间以后,系统会调用相应的方法来响应事件。但有时我们发现UIView不能接收到事件,如果是这种情况,可以从一下几点考虑:
1.不接收用户交互
userInteractionEnabled = NO
2.隐藏
hidden = YES
3.透明
alpha = 0.0 ~ 0.01
提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的

附上一张图能很好地来说明事件是怎么传递的:
这里写图片描述

二、响应者链条:
1.响应者链条示意图:
这里写图片描述

2..响应者链的事件传递过程:
<1. 如果view的控制器存在,就传递给控制器;
<2. 如果控制器不存在,则将其传递给它的父视图
<3. 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
<4. 如果window对象也不处理,则其将事件或消息传递给UIApplication对象
<5.如果UIApplication也不能处理该事件或消息,则将其丢弃。

3.如何寻找下一个响应者?
1> 如果当前这个view是控制器的view,那么控制器就是上一个响应者。
2> 如果当前这个view不是控制器的view,那么父控件就是上一个响应者。

4.如果最合适处理事件的控件不想处理控件,怎么将事件传递给下一个响应者处理?
1> 不重写任何 touches…方法。
2> 在重新的touches…方法中什么也不做,直接调用父类的touches…方法。

5.什么是响应者链和它的作用?
1> 响应者链是一系列的响应者对象连接起来构成的一条链条。它开始于第一响应者和结束应用程序对象。如果第一个响应者不能处理一个事件,它将事件转发给响应者链条的下一个响应者。

2> 可以让一个触摸事件发生的时候让多个响应者同时响应事件。

0 0