Introduction
UIResponder这个类用于处理事件的响应。
UIApplication UIView以及UIView子类(包括UIWindow)等都继承自UIResponder。
这些类的实例作为一个响应对象有时候会涉及到响应者事件。
事件分类
最常见的事件有:触摸事件和运动事件。
触摸事件(Touch Event)
主要的事件处理方法有:
- touchesBegan:withEvent:,
- touchesMoved:withEvent:,
- touchesEnded:withEvent:,
- touchesCancelled:withEvent:等等。
响应者通过这些方法,根据关联参数进行触摸事件追踪和处理。
每当手指在屏幕上触摸,拖拽或者抬起,都会生成一个UIEvent对象,这个对象包含所有的手指在屏幕上产生的UITouch对象。
运动事件(Motion Event)
iOS3.0开始系统能够生成运动事件,尤其是摇晃设备的运动。处理这类事件的方法有:
- motionBegan:withEvent:,
- motionEnded:withEvent:,
- motionCancelled:withEvent:等。
另外,canPerformAction:withSender:方法可以允许响应者在当undoManager属性返回响应链中最近的NSUndoManager对象的时候从用户界面使命令生效。
远端控制事件(Remote-Control Event)
在iOS4,UIResponder新加了remoteControlReceivedWithEvent:这个方法来处理远程控制事件。
处理响应链(Responder Chain)
事件响应
事件传递路径:
如上图所示:
- 一般的,事件会从手指或者鼠标触摸的响应者开始,沿着view的等级往上传递到window然后到application。
- 如果第一响应者不能处理事件,会把事件传递给响应链中的下一个响应者;
- 一个视图的下一个响应者是它视图控制器(UIViewController)(如果有的话),然后再转给它的父视图(Super View);
- 视图控制器(如果有的话)的下一个响应者为其管理的视图的父视图;
- 单例的窗口(UIWindow)的内容视图将指向单例应用(UIApplication)作为它的下一个响应者;
- 单例的应用(UIApplication)是一个响应者链的终点,它的下一个响应者指向nil,以结束整个循环。
- 事件消息沿着响应链传递到最顶层的响应者,直到事件被处理,如果没有对象处理该事件,APP将把事件丢弃。
事件分发(Event Delivery)
First Responder
维基百科上对它的一般定义为:第一响应者是在当发生车祸,自然灾害或者恐怖袭击等紧急情况下作为第一人到达现场处理的人。一般包含,警察,消防员,急救医务人员等等。
因此,在APP中,第一个接收到事件的对象称为第一响应者。它能接收到关键事件,摇晃运动事件,还能接收(鼠标,多手指触摸)等等事件。一般,第一响应者是一个window中APP认为最适合处理事件的view。