
NSResponder 響應對象
NSResponder是一個抽象類, 它使其所有的派生類具有事件處理(event handling)能力. 它定義了一套消息在不同的鼠標和鍵盤事件發生時調用. 它同樣定義了應用程序對象之間的事件處理機制. NSResponder類定義了應用程序中所有事件處理對象, 處理消息的默認行為. 相應對象模型基於一下三個概念:
事件消息直接輸入與事件相配合的消息, 比如鼠標點擊或鍵盤按鍵等.動作消息這種消息描述更高級別的命令, 如cut: 或者paste: 等響應對象鏈響應對象鏈是指被事件或動作消息應用的一系列響應對象. 如果消息沒有被給定的響應對象處理, 就會傳給鏈中的下一個對象.相應對象鏈允許相應對象把的自己職責委托給系統中的其他對象. 相應對象鏈中的對象順序由應用程序的視圖, 窗口和NSApp對象之間的相互關系絕定. 視圖的下一個相應對象往往是它的父視圖, 內容視圖的下一個相應對象則是窗口本身. 在窗口之後, 事件最終傳遞給NSApp對象.
動作消息的相應對象鏈要更長一些, 即消息一直沿著相應對象鏈一直傳到窗口, 如果該對象序列出於鍵窗口中, 消息還會在主窗口中沿同樣路徑傳遞, 直到最後傳給NSApp對象.
第一相應對象
第一響應對象是窗口中第一個對鍵盤事件做出響應的視圖對象, 應用程序的每個窗口都會跟蹤其視圖層次結構中的第一個響應對象的狀態. 例如在TextEdit的應用程序中, 新文檔的窗口就是第一響應對象, 因為它第一個接受來自鍵盤的事件. 窗口默認的第一響應對象就是它自己, 但鼠標在窗口中點擊的任何視圖都能使其成為第一相應對象. 如果該視圖不能處理事件, 就傳給相應對象鏈中的下一個對象.
在多窗口的桌面環境下, 用戶可以用鼠標點擊的方式激活窗口. 此時該窗口成為鍵窗口, 它的第一相應對象就成為任何用戶事件的目標. 如果又選中了別的窗口, 那麼當前窗口就成為鍵窗口, 它的第一響應對象也就成為當前的第一相應對象. 如果沒有選中對象或者窗口中沒有控件, 那麼窗口自身就是第一響應對象.
您可以用Interface Builder或通過編程的方式設置initialFirstResponder(初始響應對象), 讓最先能合乎邏輯地使用鍵盤的控件在窗口出現時獲得焦點, 成為第一相應對象.
視圖和控件可以拒絕使自己處於第一響應對象狀態, 例如顯示靜態圖像的視圖也許不接受成為第一相應對象的狀態, 相應對象可以通過實現acceptFirstResponder方法並返回NO來表示它不像處於第一響應對象的狀態.
事件路由
事件基於其類型進行路由. NSApp對象把大部分的事件消息發給發生用戶動作的窗口. 其中, 鼠標事件會轉發給該窗口的視圖層次結構中被鼠標點擊的視圖; 鍵盤事件會轉發給第一響應對象. 如果視圖對象可以響應該事件或者說它接受成為第一響應事件的狀態, 並且定義了與事件消息對應的NSResponder方法, 那麼它就負責處理事件, 否則, 這個事件就會轉發給對象響應鏈中的下一個相應對象.
NSWindow類自行處理了一些事件而不傳遞給視圖, 比如窗口移動(window-moved), 窗口尺寸變更(window-resized)和窗口暴露(window-exposed)事件. NSApp也會自行處理一些事件, 比如應用程序激活(application-active)和應用程序休眠(application-deactivate)事件.
NSWindow 窗口
每個NSWindow對象都管理屏幕上一個對應的實際窗口. 它繪制窗口的框架並響應用戶針對窗口的動作, 如關閉, 移動, 改變尺寸以及對窗口的其他操作.NSWindow的主要功能是在它的內容區域(content area)
......
(累了....看demo去了...下次繼續)

Leave a comment