响应者链

作者: 007Mango | 来源:发表于2015-08-25 17:30 被阅读1877次

    很多类型事件的传递都依赖于响应者链。响应者链是一系列响应者对象的关系集。它始于第一响应者而终于Application对象。如果第一响应者不能处理这个事件,它会将事件传递给响应者链中得下一个响应者。

    第一响应者是一个可以响应并处理事件的对象。UIResponder就是所以响应者对象的基类,它定义了一些通用的接口并不仅仅只是事件的处理还有普遍的响应者行为。UIApplication,UIcontroller,和UIview类的实例都是响应者,这就意味所有的view和大多数关键的controller对象都是响应者。值得注意的是核心动画图层Core Animation layers不是响应者。(看看它们都是继承谁就就知道啦)

    第一响应者被设计为优先获得处理事件的能力。比较典型的是,第一响应者是view对象,一个响应者对象要成为第一响应者必须经过下面两件事:

    1. 覆盖canBecomeFirstResponder方法并且返回YES

    2. 收到becomeFisrtResponder消息。如果有必要的话,响应者对象可以给自己发送这样的消息。

    注意:指定第一响应者对象之前一定要确认你的app已经被建立。例如,你比较典型的调用becomeFirstRespnder方法在viewDidAppear:方法中。如果你尝试着在viewWillAppear:去指定第一响应者,你的对象绘制还没有被建立,以至于becomeFirstResponder方法会返回NO。

    事件并不是唯一依赖响应者链的对象。响应者链通常被使用宇一下所有的情况:

    触摸事件:如果命中测试view不能处理触摸事件,这个事件就会被传递到响应者链中命中view的上一个响应者。

    手势事件:使用UIKit去处理震动手势事件,第一响应者必须要么实现UIResponderd的motionBegain:withEvent:方法要么实现motionEnded:withEvent:方法

    远程控制事件:为了去处理“远程控制事件”,第一响应者必须实现UIResponder的remoteControlReceivedWithEvent:方法。

    行为消息:当用户操作一个控制,例如一个button或者switch,并且行为方法的目标是nil,这个消息将会被通过响应者链从控制器view开始发送。

    如果initial object(初始对象)命中测试view或者第一响应者不能处理该事件,UIKit会递交事件给响应者链中的下一个响应者。每一个响应者都有权决定它是否想要去处理该事件或者是继续递交给它自己的下一个响应者通过调用nextResponder方法。这个过程将会持续到某个响应者处理该事件或者没有更多的响应者为止。

    响应者链队列始于iOS侦测事件并且递交她给initial对象,那是一个典型的view。这个initialview具备优先处理事件的权利,如图:2-2显示了两个不同的应用构造的两个不同的事件传递路径。一个app的事件传递路径取决于它自身的构造,但是所有的事件传递都遵循相同的传递规则。

    图:2-2   iOS响应者链

    对于左边的app,事件传递按下面的路径:

    1.  Initial view 尝试着去处理事件或者消息。如果不能处理事件,它就递交事件给superview,因为这个initial view并不是视图控制器层级中得顶级view.

    2.  这个superview尝试去处理该事件,如果superview不能处理该事件,它就递交事件给它的父view,因为它也不是view层级的顶级view。

    3.  视图控制器的顶级view尝试着去处理该事件,如果连顶级view都不能处理该事件,它就递交事件给它的controller。

    4.  这个viewcontroller尝试着去处理该事件,并且如果它不能处理该事件,它就会递交事件给window。

    5.  如果window不能处理该事件,它就递交事件给singlegon app object(既UIApplication)

    6.  如果连application都不能处理该事件,那么毫无疑问该事件将会被丢弃。

    右边的应用传递按照稍微不同的路径,但是所有的事件传递都遵循相同的传递规则:

    1.  一个view controller层级中得view向上递交事件知道它到达顶级view。

    2.  顶级view递交事件给它的controller。

    3.  Viewcontroller递交事件给它的顶级view的superview,步骤1-3重复直到它到达rootcontroller。

    4.  这个rootviewcontroller递交事件给window对象。

    5.  window对象递交事件给application对象。

    上一篇iOS 响应者链,事件的传递

    相关文章

      网友评论

        本文标题:响应者链

        本文链接:https://www.haomeiwen.com/subject/qbdqcttx.html