簡體   English   中英

ios Responder鏈-視圖如何捕獲事件?

[英]ios Responder chain - how does a View capture an event?

根據https://developer.apple.com/library/ios/documentation/General/Conceptual/Devpedia-CocoaApp/Responder.html的說明 ,“如果視圖是由視圖控制器管理的,並且該視圖無法處理事件,則視圖控制器將成為下一個響應者”

這句話是什么意思? 視圖是否可以在內部為事件定義處理程序並從本質上捕獲事件? 如果不是這種情況,則為視圖的ViewController如果已為事件顯式定義了處理程序,則將被調用?

似乎與View處理事件的MVC模式相反-或者文檔是否真的說調用了特定於View的控制器上的處理程序?

有一個響應者鏈,由每個UIResponder的nextResponder()

  1. 我們開始的UIView。

  2. 如果此UIView是UIViewController的view ,則該UIViewController。 (這就是您引用的段落所說的。)

  3. UIView的超級視圖。

  4. 返回步驟2並重復! 不斷重復直到我們到達...

  5. UIWindow。

  6. UIApplication。

  7. UIApplication的委托。

某些消息不是發送給特定對象,而是發送給響應者鏈。 我們一個特定的對象開始 ,但是如果該對象沒有該方法的實現,則不會崩潰。 取而代之的是,我們沿着響應者鏈走,尋找在鏈中更遠的某個人,該人確實對該方法有實現。 此外,如果我們永遠也找不到這樣的實現,我們不死機; 消息從鏈的末端掉落而不會受到懲罰。

有兩種主要信息:

  • 觸摸事件。

  • 無目標的動作。

關於您的問題,這與MVC有什么關系? 沒有。 正如喬什·加夫尼(Josh Gafni)正確回答的那樣,MVC並不是世界上唯一的模式。 這是關於響應者,而不是MVC。

UIView實際上已經具有可以覆蓋的事件處理程序。 您可以使用以下方法來UIView並處理觸摸事件:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

View和View Controller之間有兩種通信方式。 通常,視圖控制器通常會告訴視圖要顯示的內容,並且事件發生時,視圖往往會調用委托方法。 我確實知道,盡管您通常希望這些事件處理程序由View調用,但在View Controller中處理。 但...

  1. 您可以免費獲得這些方法以及UIView ,它們與View特別相關。
  2. 您可以將它們作為更接近View的較低級別的委托方法進行查看
  3. 假設您有2條靜態內容,並且用戶每次觸摸“查看內容”翻轉。 是的,您可以(有些人會說應該)在View和View Controller之間分開,但是這是一段非常簡單的代碼,因此與View直接相關,因此將其放在一起實際上可能不太混亂,也更加簡潔。
  4. 除了MVC,還有其他設計模式,Apple不一定只需要為一種設計模式提供工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM