用户在使用app的时候,会产生各样的事件。在iOS中的事件可以分为三种

  1. 触摸事件(Touch Event)
  2. 加速计事件(Accelerometer Event)
  3. 远程控制事件(Remote Control event)

在iOS中,并不是所有的对象都能处理事件,直接或者间接继承UIResponder的对象(UIApplication、 UIViewController、UIWindow和所有继承自UIView的UIKit类)才能对事件进行响应,我们称呼这些为“响应者对象”;

在UIRecponder中提供了下面的代码来处理事件:

  //触摸事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
//加速计事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event; //远程控制事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

那我们就可以用触摸事件处理的过程来说一下响应者链条和响应者对象,在刚才我们说了能对事件进行响应的叫做响应者对象,响应者对象能够响应、处理事件。而响应者链条是由多个响应者对象构成的一个具有层级关系的东西。

比如下图:

上图中的view,controller,window,application都是响应者对象,按照箭头的走向不难看出响应者链条的关系:

  1. 响应者链条是由响应者对象组成(view,controller,window,application。。。)
  2. 一个响应者的下一个响应者是他的父控件,或者是他所在的控制器

响应者链条可以让多个响应者同时响应一个触摸事件;

我在颜色View.m的文件中写了

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

NSLog(@"颜色View被摸了" );

}

的代码,当一个view被点击,它是响应者链的开端。整个响应者链和事件分发的使命都是找出第一响应者。这个第一响应者是最适合做出响应事件的对象,整个响应过程是这样子的:

 UIAppliction --> UIWiondw -->递归找到最适合处理事件的控件-->控件调用touches方法-->判断是否实现touches方法-->没有实现默认会将事件传递给上一个响应者-->找到上一个响应者

  1. 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图

  2. 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理

  3. 如果window对象也不处理,则其将事件或消息传递给UIApplication对象

  4. 如果UIApplication也不能处理该事件或消息,则将其丢弃

当我在greenViewa.m中touchesBegan的方法中添加代码

[super touchesBegan:touches withEvent:event];

在图片中可以看出greenView是Yellow的子视图,也就是说greenview的下一个响应者时yellow,而greenview.m中调用了super,那么就是说yellow也可以响应touchesBegan的方法,

这样的话运行结果就是:

2015-11-07 00:35:01.748 ResponderChain[4984:95390] yellowView被摸了

2015-11-07 00:35:01.748 ResponderChain[4984:95390] greenView被摸了

这样就实现了多个响应者对象响应一个事件。我们可以用这个作出有意思的东西。

参考文献:

https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html#//apple_ref/doc/uid/TP40009541-CH4-SW1

响应者链条,iOS中touchs事件的处理流程。的更多相关文章

  1. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  2. 1.0 iOS中的事件

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书”   在用户使用app过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型: UIK ...

  3. iOS中的事件响应链、单例模式、工厂模式、观察者模式

    学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary iOS中事件传递和相应机制 i ...

  4. iOS中的事件传递和响应者链条

    本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UI ...

  5. 一、iOS中的事件可以分为3大类型

    触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象" UIApplica ...

  6. iOS中touches事件,addtarget ...action和GestureRecognizer详解

    刚学完uiview,uicontrol类,许多人知道 touchesBegain,touchesMoved,touchesEnd,GestureRecognizer的用途,但仔细考虑这些事件之间的关系 ...

  7. iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

    触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponde ...

  8. ios中的事件处理、响应者链条以及第一响应者

    在ios中,事件UIEvent类来表示,当一个事件发生时,系统会搜集的相关事件信息,创建一个UIEvent对象,最后将该事件转发给应用程序对象(UIApplication).日常生活中,主要有三种类型 ...

  9. iOS中的触摸事件和手势处理

    iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...

随机推荐

  1. libvirt- Virsh 所有命令详单

    help            打印帮助    attach-device   从一个XML文件附加装置    attach-disk     附加磁盘设备    attach-interface 获 ...

  2. [POJ] Palindrome

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 62102   Accepted: 21643 Desc ...

  3. CentOS 修改源为163和指定epel源和docker安装

    首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...

  4. 04_java之基本语法02

    01switch语句解构 * A:switch语句解构 a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. b:格式如下: swtich(表达式){ case 常量1 : 要 ...

  5. mongodb主从复制 副本集(六)

    主从复制副本集 8888.conf dbpath = D:\software\MongoDBDATA\07\8888 #主数据库地址port = 8888 #主数据库端口号bind_ip = 127. ...

  6. 跟我学算法-Logistic回归

    虽然Logistic回归叫回归,但是其实它是一个二分类或者多分类问题 这里的话我们使用信用诈骗的数据进行分析 第一步:导入数据,Amount的数值较大,后续将进行(-1,1)的归一化 data = p ...

  7. 跟着太白老师学python 10day 函数的动态参数 *args, **kwargs, 形参的位置顺序

    1. *args 接收实参的位置参数, **kwargs接收实参的关键字参数 def func(*args, **kwargs): print(args, kwargs) func(1, 2, 3, ...

  8. Git(一):Eclipse中配置Git

    在Eclipse中配置Git: 一,由于我使用的是新版本的eclipse j2ee 4.4默认集成git,所以不用手动安装git插件 二,Eclipse配置基础信息.Windows->Prefe ...

  9. iOS学习之UIPickerView控件的关联选择

    接上篇iOS学习之UIPickerView控件的简单使用 接着上篇的代码 http://download.csdn.net/detail/totogo2010/4391870 ,我们要实现的效果如下: ...

  10. kubernetes configmap

    ConfigMaps允许您将配置工件与image内容分离,以保持容器化应用程序的便携性. 本页面提供了一系列使用示例,演示如何使用ConfigMaps中存储的数据创建ConfigMaps和配置Pod. ...