用户在使用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. Linux下sz下载文件超过4G办法

    当下载文件超过4G时,sz提示能下载. 解决办法有以下几种: 1.scp 2.ftp 3.nc 4.icmp 5.文件切割 ---------------------------------- 以上4 ...

  2. oracle的同义词总结

      oracle的同义词总结   从字面上理解就是别名的意思,和视图的功能类似.就是一种映射关系.   同义词拥有如下好处:   节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;  扩展的 ...

  3. mac 更改初始密码

    1.进入到bin目录下: cd /usr/local/mysql/bin/2.sudo su 3../mysql -uroot  -p(后面跟安装mysql的初始密码,在通知里面有) 4.SET PA ...

  4. Resetting the Root Password Using rd.break for RHEL7

    Start the system and, on the GRUB 2 boot screen, press the e key for edit. Remove the rhgb and quiet ...

  5. 有关DotNetBar设计样式和运行时的样式不一致的问题

    可以在 窗体类构造函数的InitializeComponent后加上下面圈出的内容:  this.EnableGlass = false; 参考文章 DotNetBar如何控制窗体样式

  6. 初识tornado

    Tornado 参考:  http://www.cnblogs.com/wupeiqi/articles/5702910.html Tornado 是 FriendFeed 使用的可扩展的非阻塞式 w ...

  7. 左侧倒换菜单 frameset 已过时

    <!doctype html><html><frameset cols="200,*"> <frame src="left.ht ...

  8. js生成元素的事件不执行问题

    要求:双击span标签,可以修改.<div class="commands_ticketmiddl_ine_new" > <span>NO:</spa ...

  9. sql中问号是干什么的??

    第一次在后台 程序中遇到sql语句中的问号: /** * * 方法描述 : 通过账号id更新该账号状态 * @param state 状态 * @param id 账号id */ @Modifying ...

  10. 201671010140. 2016-2017-2 《Java程序设计》java学习第十一周

     java学习第十一周     本周,进行了java集合方面的知识,在博客园的帮助下,我的课前预习更有条理性,重点明确,本周的课堂反应明显更好了,首先,梳理一下本周知识点.  Collection   ...