iOS: 事件響應(yīng)鏈

這個問題啊經(jīng)常問,網(wǎng)上資料非常多,但是自己老是答不好:

響應(yīng)鏈:響應(yīng)事件的一系列響應(yīng)者組成的一個層次結(jié)構(gòu)。

事件,有三種:

1、Touch Events,點擊事件;

2、Motion Events,移動事件,比如監(jiān)聽加速器、陀螺儀 產(chǎn)生的事件;

3、Remote Control Events,遠(yuǎn)程控制事件, 比如耳機,可以控制你的音量、播放音樂。

其次,誰來響應(yīng)事件?UIResponder,響應(yīng)者。都有誰?UIView、UIViewController、UIApplication,Window繼承View,直接或間接繼承至UIResponder。

我們經(jīng)常遇到的呢是第一種事件,后面兩種不常用。事件產(chǎn)生后,我們要找 First Responder,后面兩種的 First Responder 由用戶指定, 第一種由系統(tǒng)自己找, 當(dāng)然我們可以重寫UIResponder 里面的方法來設(shè)置 First Resoinder。應(yīng)用場景:進(jìn)入登錄頁面,鍵盤自動彈出來,把UITextField設(shè)置為 First Resoinder就可以了。

找 First Responder: self.view開始找,- pointInside判斷是否在身上,在,調(diào)用 - hitTest,遞歸子控件,調(diào)用這兩方法;如果沒有子控件或子控件 - pointInside 返回 NO 或者 - hitTest返回 nil,則父控件為First Responder。

事件傳遞: UIResponder 有個 nextResponder ,事件傳遞就是從First Responder沿著Responder Chain傳遞到nextResponder,直到事件被處理或者舍棄。

常見的Responder傳遞方向有:

Initial View->Parent View->ViewController->Window->Application

如果最終傳遞到Application對象,依然沒有對事件作出響應(yīng),事件就會被舍棄掉。

通常來說,子視圖的nextResponder即為其父視圖。如果子視圖直接依附于ViewController,則該子視圖的nextResponder即為其依附的ViewController

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點擊了?糾結(jié)于如何實現(xiàn)這個奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 59,514評論 51 604
  • 在iOS開發(fā)中經(jīng)常會涉及到觸摸事件。本想自己總結(jié)一下,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載。作者:L...
    WQ_UESTC閱讀 6,247評論 4 26
  • 一. Hit-Testing 什么是Hit-Testing?對于觸摸事件, window首先會嘗試將事件交給事件觸...
    面糊閱讀 1,037評論 0 50
  • 響應(yīng)鏈?zhǔn)侨绾涡纬傻模?當(dāng)我們觸碰到屏幕的時候,整個iOS系統(tǒng)發(fā)生了什么呢? 這里有個思路需要轉(zhuǎn)變一下,本質(zhì)上,我們...
    點燃火焰閱讀 3,650評論 5 24
  • App通過響應(yīng)者對象來接收和處理事件,響應(yīng)者對象都是UIResponder的子類對象,常見的UIView,UIVi...
    FlyElephant閱讀 1,334評論 0 5

友情鏈接更多精彩內(nèi)容