定义:能够接收和处理事件的对象。
在iOS中,所有的响应者对象都是继承自UIResponder类的实例,常见的子类包括:UIApplication、UIView和UIViewController。UIKit会自动管理响应者相关的行为。
当任何事件发生时,系统首先询问当前的第一响应者。在iOS中,任何UIResponder类的子类都能称为第一响应者。UIKit会为每个事件指派第一响应者,首先把事件传给第一响应者。第一响应者因事件的类型而变化。
Touch Event:第一响应者是点击事件发生的视图。Press events:第一响应者是焦点所在的响应者。Motion events:第一响应者是你指定的用来处理事件的对象。该事件不遵循响应者链。Shake-motion events:第一响应者是你(或UIKit)指定的作为第一响应者的对象。Remote-control events:第一响应者是你(或UIKit)指定的作为第一响应者的对象。Editing-menu messages:第一响应者是你(或UIKit)指定的作为第一响应者的对象。如果第一响应者不能处理事件,事件就会继续传递下去,被下一个Responder接收,如果下一个responder也不处理,又会被下下个responder接收…直到一个responder处理了事件或者没有responder了。这些responder按照传递次序连接起来的链条就构成了响应链。
苹果解释了沿着链条访问的历程:
UIView 如果view是一个view controller的根视图,那么这个view的next responder就是该view controller。如果view不是一个view controller的根视图,那么这个view的next responder就是该view的superview。UIViewController 如果view controller的view是一个窗口(window)的根视图,那么next responder就是window对象。如果view controller是被其它view controller展现的,那么next responder就是展现它的view controller。UIWindow window的next responder是application对象。UIApplication 应用程序对象的next responder是应用程序的代回调(delegate),但是只有应用程序对象的回调是UIResponder实例时候。(从iOS5开始,应用程序委托继承自UIResponder,而不在像之前那样继承自NSObject)响应链是由近及远进行传递。
当事件发生时,会通过硬件驱动传递到Core层,在传递到应用层,若是基于UI的应用程序,在传递给UIApplication,通过sendEvent方法传递给keyWindow,在传到UIView,UIView需要判断userInteractionEnabled,然后做hitTest。
响应事件的具体响应者,我们称之为:Hit-Testing View,寻找Hit-Testing View的过程我们称之为:Hit-Test。
Hit-Test是一个由远及近的过程。