在 iOS中,事件可以分为三类: 触摸事件(Multitouch events),加速计事件(Acceleromter events),远程控制事件(Remote control events)
1.什么是响应者链条
1)
响应者链条就是由多个响应者对象连接起来的层次结构,响应者对象是继承自UIResponder的对象,能够处理事件.所有的view 和 viewController 都是响应者对象.利用响应者链条我们可以通过调用touches的super 方法,让多个响应者同时响应该事件
2)每一个应用都有一个响应者链,我们的视图结构是一个 N叉树(一个视图可以有多个子视图,一个子视图同一时刻只能有一个父视图),每一个继承自 UIResponder的对象都可以在这个N叉树中扮演一个节点.当叶节点成为最高响应者的时候,从这个叶节点开始往其父节点开始追溯出一条链,那么对于一个叶节点来说,这一条链就是当前的响应者链. 响应者链将捕获到的 UIEvent 和 UITouch 从叶节点开始层层乡下分发,期间可以选择停止分发,也可以选择继续乡下分发.
2.响应者链的事件传递机制:
如果当前view 不能处理当前事件,那么事件就会沿着响应者链进行传递,直到遇到能够处理该事件的响应者.
事件传递过程:
3.响应者链的传递过程:
1)如果view 的控制器存在,则传递给控制器,若不存在,则传递给它的父视图
2)在视图层次结构的最顶级视图,如果也不能处理收到的消息,则将事件或者消息传递给 window 对象进行处理
3)如果 window 对象也不能处理,则其将事件传递给 UIApplication 对象
4)如果 UIApplication 对象也不能处理该事件或消息,则将其丢弃
例如一个 触摸 事件处理的详细过程:
1)用户点击屏幕后产生一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件.
2)找到最合适的视图控件后,就会调用控件的touches 方法来做具体的事件处理
touchesBegan…
touchesMoved…
touchesEnded…
这些touches 方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理
一次完整的触摸事件的传递响应的过程:
UIApplication -> UIWindow -> 递归找到最合适处理事件的控件 -> 控件调用 touches 方法 -> 判断是否实现 touches 方法 -> 没有实现默认会将事件传递给上一个响应者 -> 找到上一个响应者
4.事件处理原则
默认是顺着响应者链条向上传递将事件交给上一个响应者进行处理,如何判断当前响应者的上一个响应者是谁?
1)判断当前view是否是控制器的view,如果是,则上一个响应者是 控制器
2) 如果不是,则当前view 的上一个响应者是其父控件