響應者和響應者鏈

核心的應用程序對象-NSApplicationNSWindow、和NSView-都是響應者,它們是NSResponder(參見圖6-19)的直接或間接子類的實例。這個抽象類定義了可以響應事件的對象的接口和指望的行爲。NSResponder的子類徹底或部分實現了這個行爲。html


圖6-19  NSResponder及其直接子類架構


請注意:還有其它兩個Application Kit類直接繼承自NSResponderNSWindowControllerNSDrawer。雖然NSWindowController是Cocoa文檔架構的一部分(參見"其它Cocoa架構"部分的描述),這兩個類都不是核心Cocoa應用程序架構的中心。app

NSResponder類爲核心應用程序架構的三個主要模式或機制定義了一個接口:框架

  • 它聲明瞭一些處理事件消息(也就是源自用戶事件的消息,好比象鼠標點擊或按鍵按下這樣的事件)的方法。ui

  • 它聲明瞭數十個處理動做消息的方法,它們和標準的鍵綁定(好比那些在文本內部移動插入點的綁定)密切相關。動做消息會被派發到目標對象;若是目標沒有被指定,應用程序會負責檢索合適的響應者。spa

  • 它定義了一套在應用程序中指派和管理響應者的方法。這些響應者組成了咱們所知道的響應者鏈-即一系列響應者,事件或動做消息在它們之間傳遞,直到找到可以對它們進行處理的對象。code

響應者鏈是Application Kit事件處理架構的中心機制。它由一系列連接在一塊兒的響應者對象組成,事件或者動做消息能夠沿着這些對象進行傳遞。如圖6-20顯示的那樣,若是一個響應者對象不能處理某個事件或動做-也就是說,它不響應那個消息,或者不認識那個事件,則將該消息從新發送給鏈中的下一個響應者。消息沿着響應者鏈向上、向更高級別的對象傳遞,直到最終被處理(若是最終仍是沒有被處理,就會被拋棄)。orm


圖6-20  響應者鏈htm


當Application Kit在應用程序中構造對象時,會爲每一個窗口創建響應者鏈。響應者鏈中的基本對象是NSWindow對象及其視圖層次。在視圖層次中級別較低的視圖將比級別更高的視圖優先得到處理事件或動做消息的機會。NSWindow中保有一個第一響應者的引用,它一般是當前窗口中處於選擇狀態的視圖,窗口一般把響應消息的機會首先給它。對於事件消息,響應者鏈一般以發生事件的窗口對應的NSWindow對象做爲結束,雖然其它對象也能夠做爲下一個響應者被加入到NSWindow對象的後面。對象

對於動做消息,響應者鏈則比較複雜。有如下兩個因素決定了動做消息的響應者鏈:

  • 若是應用程序當前既有主窗口,也有鍵盤焦點窗口,則兩個窗口的響應者鏈都會參與,其中鍵盤焦點窗口的響應者鏈首先得到處理動做的機會。在每個窗口鏈的最後,Cocoa會給NSWindow的委託對象響應動做的機會;在合併的響應者鏈的最後是NSApp以及它的委託對象。

  • 應用程序的類型-是簡單的基於文檔的程序,仍是使用窗口控制器的程序-這決定鏈中的響應者對象的類型和位置。

NSResponder類也包含有錯誤表示和恢復、消息派發、應用程序幫助、以及實現其它功能的方法。

==============================邪惡的分割線==============================

以上是Apple的官方文檔,地址是:

http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CoreAppArchitecture/chapter_7_section_6.html

理解以上要注意如下幾點:

一、以上文檔介紹的是MAC OS X 下的響應者和響應者鏈的相關邏輯,這個和IOS中的邏輯是基本相同的,只是實現的類不同而已。

二、NSApplicationNSWindow、和NSView 分別對應了 IOS 中的UIApplication、UIWindow、和UIView.


三、當Application Kit在應用程序中構造對象時,會爲每一個窗口創建響應者鏈,一樣的在 IOS中對應的是 UIKit這個框架,IPhone的應用程序就一個窗口,因此只會有一個響應

     者鏈。

相關文章
相關標籤/搜索