响应者链

很多类型事件的传递都依赖于响应者链。响应者链是一系列响应者对象的关系集。它始于第一响应者而终于Application对象。如果第一响应者不能处理这个事件,它会将事件传递给响应者链中得下一个响应者。

第一响应者是一个可以响应并处理事件的对象。UIResponder就是所以响应者对象的基类,它定义了一些通用的接口并不仅仅只是事件的处理还有普遍的响应者行为。UIApplication,UIcontroller,和UIview类的实例都是响应者,这就意味所有的view和大多数关键的controller对象都是响应者。值得注意的是核心动画图层Core Animation layers不是响应者。(看看它们都是继承谁就就知道啦)

第一响应者被设计为优先获得处理事件的能力。比较典型的是,第一响应者是view对象,一个响应者对象要成为第一响应者必须经过下面两件事:

1. 覆盖canBecomeFirstResponder方法并且返回YES

2. 收到becomeFisrtResponder消息。如果有必要的话,响应者对象可以给自己发送这样的消息。

注意:指定第一响应者对象之前一定要确认你的app已经被建立。例如,你比较典型的调用becomeFirstRespnder方法在viewDidAppear:方法中。如果你尝试着在viewWillAppear:去指定第一响应者,你的对象绘制还没有被建立,以至于becomeFirstResponder方法会返回NO。

事件并不是唯一依赖响应者链的对象。响应者链通常被使用宇一下所有的情况:

触摸事件:如果命中测试view不能处理触摸事件,这个事件就会被传递到响应者链中命中view的上一个响应者。

手势事件:使用UIKit去处理震动手势事件,第一响应者必须要么实现UIResponderd的motionBegain:withEvent:方法要么实现motionEnded:withEvent:方法

远程控制事件:为了去处理“远程控制事件”,第一响应者必须实现UIResponder的remoteControlReceivedWithEvent:方法。

行为消息:当用户操作一个控制,例如一个button或者switch,并且行为方法的目标是nil,这个消息将会被通过响应者链从控制器view开始发送。


如果initial object(初始对象)命中测试view或者第一响应者不能处理该事件,UIKit会递交事件给响应者链中的下一个响应者。每一个响应者都有权决定它是否想要去处理该事件或者是继续递交给它自己的下一个响应者通过调用nextResponder方法。这个过程将会持续到某个响应者处理该事件或者没有更多的响应者为止。

响应者链队列始于iOS侦测事件并且递交她给initial对象,那是一个典型的view。这个initialview具备优先处理事件的权利,如图:2-2显示了两个不同的应用构造的两个不同的事件传递路径。一个app的事件传递路径取决于它自身的构造,但是所有的事件传递都遵循相同的传递规则。

图:2-2   iOS响应者链


对于左边的app,事件传递按下面的路径:

1.  Initial view 尝试着去处理事件或者消息。如果不能处理事件,它就递交事件给superview,因为这个initial view并不是视图控制器层级中得顶级view.

2.  这个superview尝试去处理该事件,如果superview不能处理该事件,它就递交事件给它的父view,因为它也不是view层级的顶级view。

3.  视图控制器的顶级view尝试着去处理该事件,如果连顶级view都不能处理该事件,它就递交事件给它的controller。

4.  这个viewcontroller尝试着去处理该事件,并且如果它不能处理该事件,它就会递交事件给window。

5.  如果window不能处理该事件,它就递交事件给singlegon app object(既UIApplication)

6.  如果连application都不能处理该事件,那么毫无疑问该事件将会被丢弃。

右边的应用传递按照稍微不同的路径,但是所有的事件传递都遵循相同的传递规则:

1.  一个view controller层级中得view向上递交事件知道它到达顶级view。

2.  顶级view递交事件给它的controller。

3.  Viewcontroller递交事件给它的顶级view的superview,步骤1-3重复直到它到达rootcontroller。

4.  这个rootviewcontroller递交事件给window对象。

5.  window对象递交事件给application对象。


上一篇iOS 响应者链,事件的传递

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 用户以多种方式操纵他们的iOS设备,例如触摸屏幕或摇动设备。 iOS会解释用户何时以及如何操作硬件并将此信息传递到...
    坤坤同学阅读 3,984评论 7 19
  • 一. Hit-Testing 什么是Hit-Testing?对于触摸事件, window首先会尝试将事件交给事件触...
    面糊阅读 817评论 0 50
  • 概述 应用程序使用响应者对象来接收和处理事件,属于UIResponder类的实例对象都是响应者,常见的子类包括UI...
    渐z阅读 2,644评论 0 3
  • 一、响应者链(Responder Chain) 先来说说响应者对象(Responder Object),顾名思义,...
    像小强一样活着阅读 6,876评论 8 76
  • 事件传递:响应者链 当你设计一个app的时候,你很可能需要你的app能够动态响应某些事件。比如,触摸可以发生在屏幕...
    hjfrun阅读 1,025评论 1 5