日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 响应链

發布時間:2025/4/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 响应链 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先要明確的是:在IOS中,有響應者鏈對事件進行響應,所有的響應類都是UIResponder的子類,響應者鏈是一個由不同對象組成的層次結構,其中的每個對象將依次獲得響應事件消息的機會。

響應鏈的過程:

當事件發生的時候,響應鏈首先被發送給第一個響應者(往往是事件發生的視圖,也就是用戶觸摸屏幕的地方)。事件將沿著響應者鏈一直向下傳遞,知道被接受并作出處理。一般來說,第一響應這是個視圖對象或者其子類,當其被觸摸后事件就交由它處理,如果他不處理,時間就會被傳遞給視圖控制器對象UIViewController(如果存在),然后是它的俯視圖對象(superview),以此類推知道頂層視圖。接下來會沿著頂層視圖(top view)到窗口(UIwindow 對象) 再到程序的(UIApplication對象),如果整個過程都沒有響應這個事件,則該事件被丟棄,一般情況下,在響應鏈中只要有對象處理事件,事件就會被傳遞。

典型的響應路線圖如:

First ?Responser --> The Window -->The Applicationn --> App Delegate

正常的響應者鏈流程經常被委托打斷,一個對象可能將響應工作委托給另一個對象來完成(通常是視圖控制器viewcontroller)。


關于響應鏈的常見問題:

1. 如何調用父類的controller中的方法:

[[self ?superview].nextResponder method]; 或者 [[[self ?superview] ?nextResponder ] ?method];?

這兩種方法都可以,但是使用的時候最好是進行判斷一下:

?

id next = [self nextResponder]; while(![next isKindOfClass:[ViewController class]])//這里跳不出來。。。有人說這里跳不出來,其實是因為它沒有當前這個view放入ViewController中,自然也就跳不出來了,會死循環,使用時需要注意。 { next = [next nextResponder]; } if ([next isKindOfClass:[ViewController class]]) { controller = (ViewController *)next; }

?

?

2.當一個子view需要接收點擊事件,其父view也需要接收點擊事件,該如何處理:

按照正常情況下,子類接收點擊事件以后,事件不會主動傳遞到下一個響應者,因此父類便不再接收點擊事件。如果子類不處理點擊事件,則事件會一直傳遞下去,直到UIApplication。

但是我們可以使得子類處理過響應事件后仍將響應這傳遞到下一個響應者。但是我們編寫代碼才能辦到。

?

?

要做的如下: 子view的代碼如下: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 這里可以做子view自己想做的事,做完后,事件繼續上傳,就可以讓其父類,甚至父viewcontroller獲取到這個事件了[[selfnextResponder]touchesBegan:toucheswithEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {[[selfnextResponder]touchesEnded:toucheswithEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {[[selfnextResponder] touchesCancelled:toucheswithEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {[[selfnextResponder] touchesMoved:toucheswithEvent:event]; }

?

補充一段摘要:

?

摘取一部分說明:

當用戶 ?與 ?iPhone的觸摸屏 ?產生 ?互動時,硬件 ?就會探測到 ?物理接觸 ?并且 ?通知 ?操作系統。接著 ?操作系統 ?就會創建 ?相應的事件 ?并且 ?將 ?其 ?傳遞給 ?當前正在運行的應用程序的事件隊列。然后 ?這項事件 ?會被事件循環 ?傳遞給 ?優先響應者物件。優先響應者物件 ?是 ?事件 ?被觸發時 ?和 ?用戶 ?交互的物件,比如 ?按鈕物件、視圖物件。如果 ?我們 ?編寫了 ?代碼 ?讓 ?優先響應者 ?處理 ?這種類型的事件,那么 ?它 ?就會處理 ?這種類型的事件。處理完 ?某項事件后,響應者 ?有 ?兩個選項:1、將 ?其 ?丟棄;2、將 ?其 ?傳遞給 ?響應鏈條中的下一個響應者。下一個響應者的地址 ? 存儲 ?在當前響應者物件所包含的變量nextResponder當中。如果 ?優先響應者 ?無法處理 ?一項事件,那么 ?這項事件 ?就傳遞給 ?下一個響應者,直到 ?這項事件 ?到達 ?能處理它的響應者 ?或者 ?到達 ?響應鏈條的末端,也就是 ?UIApplication類型的物件。UIApplication類型的物件 ?收到 ?一項事件后,也是 ?要么 ?處理,要么 ?丟棄。

比如 ?有 ?一個視圖物件,這個視圖物件上 ?有 ?一個按鈕物件。當用戶 ?觸摸 ?這個按鈕物件時,作為優先響應者,這個按鈕物件 ?就會收到 ?一項事件。如果 ?這個按鈕物件 ?無法處理 ?這項事件,就會將 ?這項事件 ?傳遞給 ?視圖物件。如果 ?視圖物件 ?無法處理 ?這項事件,就會將 ?這項事件 ?傳遞給 ?視圖控制器物件。以此類推。

應該注意的 ?是 ?當我們 ?在使用 ?響應鏈條時,一項事件 ?并不會自動地 ?從一個響應者 ?傳遞到 ?下一個響應者。如果 ?要將 ?一項事件 ?從一個響應者 ?傳遞到 ?下一個響應者,我們 ?必須編寫 ?代碼 ?才能辦到。


轉載于:https://www.cnblogs.com/jiangu66/archive/2013/04/23/3037387.html

總結

以上是生活随笔為你收集整理的iOS 响应链的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。