1.只要继承了UIResponder的对象就可以作为事件的响应者,实际上UIControl继承自UIView,UIView 又继承自uiresponder,所有的对象都可以作为事件的响应者.
当用户与某个控件交互时该控件就作为<<<<第一响应者First responder>>>>
2.第一响应者是响应者链的开始,该事件首先被发送给第一响应者也就是用户触摸屏幕的控件,事件将沿着响应者怜一直向下传播直到被某个响应者处理
3.第一响应者一般都是UIView控件或者UIView子类控件,当用户触摸该控件后,事件最先由该控件本身处理.
4.如果事件从第一响应者开始传播,一直传播到应用界面的顶层视图的视图控制器,该事件依然没有得到处理,那么该事件就会传播到应用程序窗口UIWindow(UIWindow也继承了UIView对象)如果应用程序窗口也不处理该事件,那么就会传播到UIApplication(UIApplication同样继承自UIResponder),如果UIApplication还不处理该事件,那么该事件就会传播到应用程序委托对象>>>(使用Xcode的项目模板生成的所有的IOS项目中的应用程序委托类都继承了UIResponder).
传播路线::::
>First Responder—>First Responder的视图控制器(如果有)—>父容器(如果有)—>父容器的视图控制器(如果有)—>UIWindow—>UIApplication—>应用程序委托对象.
如果某个事件经过了完整的传播过程依然没有被处理.那么该事件就会被丢弃,一般情况,响应者链的任何响应者处理该事件,该事件就会停止传播.
如果某个响应者”拦截”了某个事件那么该响应者要根据条件判断是否要处理该事件当响应者无法处理该事件时.则需要在处理方法中手动传递该事件.代码:
-(void)handleTapEvent:(uiEvent *)event
{
//首先判断条件
if(条件){
//处理事件
}
else{
//手动调用下一个响应者的handleTapEvent方法,手动将事件传播给下一个响应者.
[self.nestResponder handleTapEvent:event];
}
}