事件的傳遞及相應者鏈條

2022-08-27 06:45:11 字數 1186 閱讀 6445

除去高大上的標題,本文主要就是講當你觸碰手機螢幕上任意點的時候,系統是怎樣找到那個需要響應該觸碰事件的控制項,以及該控制項對觸碰事件的響應情況

篩選的規則是:

1.自己是否能接收觸控事件?

2.觸控點是否在自己身上?

3.以上都滿足了就從後往前遍歷子控制項,重複前面的兩個步驟

4.如果沒有符合條件的子控制項,那麼就自己最適合處理

這裡的「問」預設是通過控制項的- (uiview*)hittest:(cgpoint)point withevent:(uievent*)event方法一層一層從外往內掉用;

找到最後找到最適合處理該觸控事件的控制項,該控制項缺省會有對觸控事件的處理:(以下就該是響應者鏈條的內容了)

根據控制項對事件的預設響應情況,大概分三種(肯定不止):

1.button:缺省會處理響應該事件,並且不會再呼叫 [super touchesbegan:touches withevent:event];向上拋響應,這樣該響應鏈條就斷了;

2.uiview: 如果不實現uitouches方法,缺省會呼叫父類(uiresponser)中的touches方法,該方法內部缺省會自動把響應交給下一響應者處理;

3.uiimageview:預設是不與使用者互動的,所以該控制項預設也就不會被選為最佳處理事件的控制項,所以該種類不應該算;

如果控制項自己實現了touches方法來處理觸控事件,並且響應完又呼叫了[super touchesbegan:touches withevent:event];來讓下一響應者繼續響應,這樣一層一層由里向外久構成了響應者鏈條;

需要說明的是:響應者不都必然是view等控制項,也可能是viewcontroller等控制器(uiviewcontroller也繼承於uiresponser);

1>如果當前這個view事控制器的view,那麼控制器就是上乙個響應者(控制器也繼承了uiresponser,所有控制器也有touches……方法)

2>如果當前這個view不是控制器的view,那麼父控制項就是上乙個響應者

響應者鏈的事件傳遞過程:

1.如果view的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父檢視

2.在檢視層次結構的最頂級檢視,如果也不能處理收到的事件或訊息,則其將事件或訊息傳遞給window物件進行處理

事件傳遞和響應者鏈條

附上一張圖能很好地來說明事件是怎麼傳遞的 二 響應者鏈條 1.響應者鏈條示意圖 3.如何尋找下乙個響應者?1 如果當前這個view是控制器的view,那麼控制器就是上乙個響應者。2 如果當前這個view不是控制器的view,那麼父控制項就是上乙個響應者。4.如果最合適處理事件的控制項不想處理控制項,...

事件的傳遞和響應(響應者鏈條)

作用 uievent稱為事件物件,記錄事件產生的時刻和型別 3.主視窗會在檢視層次結構中找到乙個最合適的檢視來處理觸控事件,這也是整個事件處理過程的第一步 4.找到合適的檢視控制項後,就會呼叫檢視控制項的touches方法來作具體的事件處理 這其實就是事件的響應,下面詳細介紹 重點 1.如何找到最合...

事件處理響應者鏈條

mj 事件的完整處理過程 1.先將事件物件由上往下傳遞 由父控制項傳遞給子控制項 找到最合適的控制項來處理這個事件 2.呼叫最合適控制項的touches.方法 3.如果touches.裡面呼叫了 super touches.方法,則順著響應者鏈條往上找,找到上乙個響應者 4.執行上乙個響應者的tou...