2012-06-10 59 views
4

我正在編寫我的第一個Cocoa應用程序。這是一個簡單的實用程序 - 一個計算器。我有一切工作,我想補充的最後一件事是我希望應用程序響應按鍵事件。所以,你可以用鼠標點擊「4」按鈕,或者你可以按下鍵盤上的「4」鍵。我正在閱讀所有事件處理文檔,但我沒有采用推薦的方法來獲取處理事件的NSResponder(或NSView)。響應keyDown事件的最佳做法

我可以做一個NSWindow的子類並告訴界面生成器製作該類型的主窗口。然後,當我重寫新的NSWindow子類中的keyDown消息時,它獲取事件,但我不確定如何將它連接到我的應用程序委託類(因爲我基本上只想打開按下的鍵並調用相應的消息在代理中,按鈕「選擇」動作的目標。

或者,我想我通過將應用程序委託類的超類從NSObject更改爲NSView或NSResponder或其他東西,但是我不確定如何真正獲得應用程序委託對象,然後實際設置爲第一響應者(我認爲這就是我想要做的事情)

所以,我是希望有人能給我具體的方向,說明我應該如何/在哪裏實施我的keyDown m方法,但我也想了解推薦的「最佳實踐」是做什麼的。蘋果會說什麼是這樣做的正確架構?我對學習如何使這項工作學習蘋果設計模式感興趣。

我的程序結構如下: 我有一個筆尖文件(實際上是一個.xib),我用我的窗口設計了一個文本框來顯示和一個按鈕。我已經從那裏註冊了出口和動作到AppDelegate類(標準項目模板爲您設置的那個)。遵循MVC模式,我有一個AppDelegate初始化的Calculator類,並且計算器的所有實際邏輯都在該類中。 AppDelegate基本上只響應來自按鈕的消息,將它們傳遞給Calculator類中的方法,然後向計算器請求當前顯示值並將其更新回到文本框中。所以,我的筆尖文件中的圖形元素是「視圖」,AppDelegate是「控制器」,Calculator類是「模型」。對?

那麼,誰應該處理keyDown事件?似乎視圖應該捕獲它們並將它們發送給控制器,但我該如何設置它?

我想一個潛在的相關問題是,我已經看到「窗口控制器」和「視圖控制器」類的提及。我不確定我是否明白這些課程的重點。我的簡單應用程序有他們嗎?應該是?

回答

3

使用NSButtonsetKeyEquivalent:方法或設置界面生成器中每個按鈕的等效鍵。

我不知道的「正確」的方式做到這一點,但自定義按鍵事件處理可以放在一個自定義窗口contentView像這樣:

- (void)keyDown:(NSEvent *)theEvent { 
    NSLog(@"keyDown:%@", theEvent); 

    //Put event handling code here. 

    [super keyDown:theEvent]; 
} 

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

如果有誰知道這樣做的正確方法這樣,隨時可以進入。

+0

謝謝,這聽起來像是我的具體問題的最佳答案。我仍然對我的更一般問題的答案感到好奇,那就是什麼正確的設計模式用於覆蓋keyDown方法。 –

+0

P.S.這解決了幾乎所有的按鈕。我正在製作一個「程序員計算器」,所以我的一些按鈕是兩個字符運算符,如「<<」。所以,我要自定義我的keyDown方法來檢測連續的兩個字符。我也想通過輸入所有作爲命令粘貼到計算器的字符來響應粘貼,以便複製和粘貼表達式來獲得計算結果 - 但是我認爲使用複製和粘貼是完全不同的野獸。 –

+0

查看答案編輯。 – spudwaffle