2012-06-10 63 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