用户在使用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. Asp.net 的cookie问题

    写代码的发现的小问题 如果写入cookie的时候指定了domin域名 那么删除的时候必须也指定domin域名才行,即使你先读取了这个已经存在的cookie,但是还是要指定domin才能删除 /// & ...

  2. 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]

    Learn Android Studio 汉化教程 [翻译]Git介绍 Git版本控制系统(VCS)快速成为Android应用程序开发以及常规的软件编程领域内的事实标准.有别于需要中心服务器支持的早期 ...

  3. freebsd静态路由

    FreeBSD下增进静态路由的行动 1.手工添加 # route add -net 192.168.2.0/24 192.168.1.2 2. 通过rc.conf永世 设置 # Add static ...

  4. 为什么stm32有的外设在进行初始化的时候需要将寄存器重设为缺省值?不设置会怎么样?

    首先,缺省值就是默认值的意思,默认值可以理解为设计芯片的人认为用这个参数,比较适中,起码不可能耽误你对某一模块进行驱动.然后,为什么除了默认值(缺省值),还有这么多其他的参数可以进行选择呢,那就要看你 ...

  5. requirejs——config

    config 函数用于requirejs的配置信息.主要包括:baseUrl.paths: 一.baseUrl: 待续

  6. leetcode914

    public class Solution { public bool HasGroupsSizeX(int[] deck) { var len = deck.Length; ; i <= le ...

  7. @RestController使用 接收jso参数 将参数转换为对象

    package com.monitor.controller; import org.springframework.http.ResponseEntity; import org.springfra ...

  8. nginx 里设置font-face 跨域

    server { ... # Fix @font-face cross-domain restriction in Firefox location ~* \.(eot|ttf|woff)$ { ad ...

  9. shell编程——流控制case和select

    在shell编程里有时候需要出现交换界面,让使用者来选择要执行的功能,如下面所示,这时候就需要用到case和select进行配合 请选择功能: 1) 退出 2) 系统升级 3) 防火墙配置 4) to ...

  10. js闭包的定义

    通过函数字面量创建的函数对象包含一个连接到外部上下文的连接,这叫做闭包. 还有一种定义:函数可以访问它被创建时所处的上下文环境,叫做闭包.