UIKit-UIResponder

Introduction

UIResponder这个类用于处理事件的响应。
UIApplication UIView以及UIView子类(包括UIWindow)等都继承自UIResponder
这些类的实例作为一个响应对象有时候会涉及到响应者事件。

事件分类

最常见的事件有:触摸事件运动事件

触摸事件(Touch Event)

主要的事件处理方法有:

  1. touchesBegan:withEvent:,
  2. touchesMoved:withEvent:,
  3. touchesEnded:withEvent:,
  4. touchesCancelled:withEvent:等等。

响应者通过这些方法,根据关联参数进行触摸事件追踪和处理。
每当手指在屏幕上触摸,拖拽或者抬起,都会生成一个UIEvent对象,这个对象包含所有的手指在屏幕上产生的UITouch对象。

运动事件(Motion Event)

iOS3.0开始系统能够生成运动事件,尤其是摇晃设备的运动。处理这类事件的方法有:

  1. motionBegan:withEvent:,
  2. motionEnded:withEvent:,
  3. motionCancelled:withEvent:等。

另外,canPerformAction:withSender:方法可以允许响应者在当undoManager属性返回响应链中最近的NSUndoManager对象的时候从用户界面使命令生效。

远端控制事件(Remote-Control Event)

在iOS4,UIResponder新加了remoteControlReceivedWithEvent:这个方法来处理远程控制事件。

处理响应链(Responder Chain)

事件响应

事件传递路径:

Mou icon
如上图所示:

  1. 一般的,事件会从手指或者鼠标触摸的响应者开始,沿着view的等级往上传递到window然后到application。
  2. 如果第一响应者不能处理事件,会把事件传递给响应链中的下一个响应者;
  3. 一个视图的下一个响应者是它视图控制器(UIViewController)(如果有的话),然后再转给它的父视图(Super View);
  4. 视图控制器(如果有的话)的下一个响应者为其管理的视图的父视图;
  5. 单例的窗口(UIWindow)的内容视图将指向单例应用(UIApplication)作为它的下一个响应者;
  6. 单例的应用(UIApplication)是一个响应者链的终点,它的下一个响应者指向nil,以结束整个循环。
  7. 事件消息沿着响应链传递到最顶层的响应者,直到事件被处理,如果没有对象处理该事件,APP将把事件丢弃。

    事件分发(Event Delivery)

    First Responder

    维基百科上对它的一般定义为:第一响应者是在当发生车祸,自然灾害或者恐怖袭击等紧急情况下作为第一人到达现场处理的人。一般包含,警察,消防员,急救医务人员等等。
    因此,在APP中,第一个接收到事件的对象称为第一响应者。它能接收到关键事件,摇晃运动事件,还能接收(鼠标,多手指触摸)等等事件。一般,第一响应者是一个window中APP认为最适合处理事件的view