這個問題啊經(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