2009-07-17 32 views
5

我正在學習如何使用Cocoa構建程序。我正在使用一個示例Apple應用程序來記錄來自網絡攝像頭的視頻。我想通過捕捉按鍵來啓動和停止視頻。我試圖覆蓋keydown事件,但我讀過這是不可能在NSObject。我該如何處理這種事件?KeyDown和Cocoa示例

該類應用程序擴展了NSObject類。

這是代碼:

- (void)keyDown:(NSEvent *)event { 
    NSLog(@"Hi there"); 
    NSString *characters = [event characters]; 
    if ([characters length]) { 
    switch ([characters characterAtIndex:0]) { 
     case NSUpArrowFunctionKey: 
     NSLog(@"Key UP"); 
     break; 
    } 
    } 
} 

回答

7

我試圖重寫keydown事件,但我讀過,這是不可能在一個NSObject。

正確。只有響應者才能響應事件。

我該如何處理這種事件?

實施響應者。對NSWindow或NSWindowController進行子類化工作。確保你的實際窗口或窗口控制器是你的子類的一個實例。

Cocoa文檔進一步解釋。

該應用程序的類擴展了一個NSObject類。

爲什麼?通常,應用程序包的主類是NSApplication或其子類 - 並且NSApplication的子類沒有太多充分的理由。

PS:什麼是一本非常好的書開始學習MacOS編程?

我沒有被Hillegass書學習,我自己(我堅持蘋果的文檔),但它是一個非常受歡迎的建議,我已經閱讀並可以告訴你,這是很好的。

+1

請注意,窗口控制器(如果存在)是事件消息的最後響應者。代表只獲取操作消息,而不是事件消息。 – IlDan 2009-07-17 23:35:05

+0

好的。我會編輯我的答案,不要聲稱是窗口委託將工作。 – 2009-07-18 01:09:21

4

Cocoa Event-Handling Guide - The Responder Chain

響應鏈是鏈接一系列響應者對象的被施加的事件或動作的消息。當給定的響應者對象不處理特定的消息時,對象將消息傳遞給鏈中的後繼者(即下一個響應者)。

當您按下某個鍵時,窗口會收到keyDown事件。然後它將事件發送到第一響應者,通常是帶有圍繞其邊界的藍色擋板的控件(嘗試點擊Safari或Firefox中的地址字段,當它被藍色嗶嗶響時,它具有第一響應者狀態) 。

如果第一反應者沒有所述按鍵(Safari的地址字段不吃它時,它顯示一個字符),然後將其傳遞下來響應鏈下一個應答器視圖層次結構,然後到窗口和窗口控制器,如在Guide中看到的那樣。(注意動作響應者是另一回事)

所以你必須實現keyDown:在你的窗口視圖或窗口本身,如果它沒有視圖吃事件。測試的最簡單方法是覆蓋keyDown:一個空窗口的方法

要將手放到內部工作中,您甚至可以嘗試覆蓋窗口的sendEvent:方法。 sendEvent:將事件分派給窗口的視圖,並從那裏例如記錄窗口管理的所有事件。

4

NSWindow子類或 NSWindowController將工作。

同樣,你可以繼承NSView並覆蓋它的事件處理方法。

什麼是開始學習的很好的書 MacOS Programming?

Learn Objective-C on the Mac Dalrymple非常簡單,涵蓋了足夠的基礎知識並且移動速度足以讓您在短時間內離開地面。它涉及從Xcode和Interface Builder到OOP和Objective-C實踐的所有內容。對初學者(恕我直言)特別有幫助的是源文件組織和基礎套件章節。

祝你好運!

+0

「確保你將你的實際窗口或窗口控制器作爲你的子類的一個實例。」再一次感謝彼得。這有助於另一個線程:http://stackoverflow.com/questions/1854112/keyup-event-heard-overridden-nsview-method – 2009-12-06 18:47:50