響應者鏈

很多類型事件的傳遞都依賴于響應者鏈烧董。響應者鏈是一系列響應者對象的關(guān)系集。它始于第一響應者而終于Application對象舀锨。如果第一響應者不能處理這個事件骂际,它會將事件傳遞給響應者鏈中得下一個響應者。

第一響應者是一個可以響應并處理事件的對象业栅。UIResponder就是所以響應者對象的基類秒咐,它定義了一些通用的接口并不僅僅只是事件的處理還有普遍的響應者行為。UIApplication碘裕,UIcontroller携取,和UIview類的實例都是響應者,這就意味所有的view和大多數(shù)關(guān)鍵的controller對象都是響應者帮孔。值得注意的是核心動畫圖層Core?Animation layers不是響應者雷滋。(看看它們都是繼承誰就就知道啦)

第一響應者被設計為優(yōu)先獲得處理事件的能力。比較典型的是文兢,第一響應者是view對象晤斩,一個響應者對象要成為第一響應者必須經(jīng)過下面兩件事:

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

2. 收到becomeFisrtResponder消息。如果有必要的話姆坚,響應者對象可以給自己發(fā)送這樣的消息澳泵。

注意:指定第一響應者對象之前一定要確認你的app已經(jīng)被建立。例如兼呵,你比較典型的調(diào)用becomeFirstRespnder方法在viewDidAppear:方法中兔辅。如果你嘗試著在viewWillAppear:去指定第一響應者,你的對象繪制還沒有被建立击喂,以至于becomeFirstResponder方法會返回NO维苔。

事件并不是唯一依賴響應者鏈的對象。響應者鏈通常被使用宇一下所有的情況:

觸摸事件:如果命中測試view不能處理觸摸事件懂昂,這個事件就會被傳遞到響應者鏈中命中view的上一個響應者介时。

手勢事件:使用UIKit去處理震動手勢事件,第一響應者必須要么實現(xiàn)UIResponderd的motionBegain:withEvent:方法要么實現(xiàn)motionEnded:withEvent:方法

遠程控制事件:為了去處理“遠程控制事件”,第一響應者必須實現(xiàn)UIResponder的remoteControlReceivedWithEvent:方法沸柔。

行為消息:當用戶操作一個控制循衰,例如一個button或者switch,并且行為方法的目標是nil勉失,這個消息將會被通過響應者鏈從控制器view開始發(fā)送。


如果initial object(初始對象)命中測試view或者第一響應者不能處理該事件原探,UIKit會遞交事件給響應者鏈中的下一個響應者乱凿。每一個響應者都有權(quán)決定它是否想要去處理該事件或者是繼續(xù)遞交給它自己的下一個響應者通過調(diào)用nextResponder方法。這個過程將會持續(xù)到某個響應者處理該事件或者沒有更多的響應者為止咽弦。

響應者鏈隊列始于iOS偵測事件并且遞交她給initial對象徒蟆,那是一個典型的view。這個initialview具備優(yōu)先處理事件的權(quán)利型型,如圖:2-2顯示了兩個不同的應用構(gòu)造的兩個不同的事件傳遞路徑段审。一個app的事件傳遞路徑取決于它自身的構(gòu)造,但是所有的事件傳遞都遵循相同的傳遞規(guī)則闹蒜。

圖: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都不能處理該事件捐下,那么毫無疑問該事件將會被丟棄顿天。

右邊的應用傳遞按照稍微不同的路徑,但是所有的事件傳遞都遵循相同的傳遞規(guī)則:

1. ?一個view controller層級中得view向上遞交事件知道它到達頂級view蔑担。

2. ?頂級view遞交事件給它的controller牌废。

3. ?Viewcontroller遞交事件給它的頂級view的superview,步驟1-3重復直到它到達rootcontroller啤握。

4. ?這個rootviewcontroller遞交事件給window對象鸟缕。

5. ?window對象遞交事件給application對象。


上一篇iOS 響應者鏈,事件的傳遞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懂从,一起剝皮案震驚了整個濱河市授段,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌番甩,老刑警劉巖侵贵,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缘薛,居然都是意外死亡窍育,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門宴胧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漱抓,“玉大人,你說我怎么就攤上這事恕齐∑蚵Γ” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵显歧,是天一觀的道長仪或。 經(jīng)常有香客問我,道長士骤,這世上最難降的妖魔是什么溶其? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮敦间,結(jié)果婚禮上瓶逃,老公的妹妹穿的比我還像新娘。我一直安慰自己廓块,他們只是感情好厢绝,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著带猴,像睡著了一般昔汉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拴清,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天靶病,我揣著相機與錄音,去河邊找鬼口予。 笑死娄周,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沪停。 我是一名探鬼主播煤辨,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼裳涛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了众辨?” 一聲冷哼從身側(cè)響起端三,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹃彻,沒想到半個月后郊闯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蛛株,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年团赁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泳挥。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡然痊,死狀恐怖至朗,靈堂內(nèi)的尸體忽然破棺而出屉符,到底是詐尸還是另有隱情,我是刑警寧澤锹引,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布矗钟,位于F島的核電站,受9級特大地震影響嫌变,放射性物質(zhì)發(fā)生泄漏吨艇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一腾啥、第九天 我趴在偏房一處隱蔽的房頂上張望东涡。 院中可真熱鬧,春花似錦倘待、人聲如沸疮跑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祖娘。三九已至,卻和暖如春啊奄,著一層夾襖步出監(jiān)牢的瞬間渐苏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工菇夸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琼富,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓庄新,卻偏偏與公主長得像公黑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 用戶以多種方式操縱他們的iOS設備凡蚜,例如觸摸屏幕或搖動設備人断。 iOS會解釋用戶何時以及如何操作硬件并將此信息傳遞到...
    坤坤同學閱讀 3,978評論 7 19
  • 一. Hit-Testing 什么是Hit-Testing?對于觸摸事件, window首先會嘗試將事件交給事件觸...
    面糊閱讀 815評論 0 50
  • 概述 應用程序使用響應者對象來接收和處理事件恶迈,屬于UIResponder類的實例對象都是響應者,常見的子類包括UI...
    漸z閱讀 2,638評論 0 3
  • 一谱醇、響應者鏈(Responder Chain) 先來說說響應者對象(Responder Object)暇仲,顧名思義,...
    像小強一樣活著閱讀 6,867評論 8 76
  • 事件傳遞:響應者鏈 當你設計一個app的時候副渴,你很可能需要你的app能夠動態(tài)響應某些事件奈附。比如,觸摸可以發(fā)生在屏幕...
    hjfrun閱讀 1,021評論 1 5