iOS基础·OC高级篇

事件响应链

2016-07-16  本文已影响79人  伊蕊飘零

事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播. 可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。
1> 首先解释响应者链的概念
UIResponder类,是UIKIT中一个用于处理事件响应的基类。窗口上的所有事件触发,都由该类响应(即事件处理入口)。所以,窗口上的 View及控制器都是派生于该类的,例如UIView、UIViewController等。调用UIResponder类提供的方法或属性,我们就可以捕捉到窗口上的所有响应事件,并进行处理。
响应者链条是由多个响应者对象连接起来的链条,其中响应者对象是能处理事件的对象,所有的View和ViewController都是响应者对象,利用响应者链条能让多个控件处理同一个触摸事件.

主循环 捕获 了用户的点击事件 : 它要做事件分发 --> 找到最适合处理这个事件的view寻找的链条: 首先找UIApplication --> UIWindow --> RootViewController --> View 到view这个层级的时候 会遍历他所有的子view (按照 倒序去遍历 --> 从最后添加的子view开始) 通过下面两个方法来进行查找

// 返回最适合处理事件的view
     - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
  内部会自动调用 pointInside 这个方法, 做判断
                                      return [super hitTest:point withEvent:event];

}
 // 检测 点击的位置是否在 这个view上
              - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
                     return [super pointInside:point withEvent:event];
}

找到最合适处理该事件view之后, 就会查找 处理事件的方法

2>事件传递机制
如果当前view不能处理当前事件,那么事件将会沿着响应者链(Responder Chain)进行传递,知道遇到能处理该事件的响应者(Responsder Object)。

  1. 接收事件的initial view如果不能处理该事件并且她不是顶层的View,则事件会往它的父View进行传递。
    2).initial view的父View获取事件后如果仍不能处理,则继续往上传递,循环这个过程。如果顶层的View还是不能处理这个事件的话,则会将事件传递给它们的ViewController,
    3). 如果ViewController也不能处理,则传递给Window(UIWindow),此时Window不能处理的话就将事件传递UIApplication,最后如果连Application也不能处理,则废弃该事件
上一篇下一篇

猜你喜欢

热点阅读