响应 keyDown 事件的最佳实践
Posted
技术标签:
【中文标题】响应 keyDown 事件的最佳实践【英文标题】:Best practice for responding to keyDown event 【发布时间】:2012-06-10 20:28:17 【问题描述】:我正在编写我的第一个 Cocoa 应用程序。这是一个简单的实用程序——一个计算器。我已经完成了所有工作,我最不想添加的是我希望应用程序响应按键事件。因此,您可以用鼠标单击“4”按钮,也可以直接按键盘上的“4”键。我正在阅读所有的事件处理文档,但我没有采用推荐的方法来获取处理事件的 NSResponder(或 NSView)。
我可以创建一个 NSWindow 的子类并告诉界面构建器创建该类型的主窗口。然后,当我在我的新 NSWindow 子类中覆盖 keyDown 消息时,它会获取事件,但我不确定如何将它连接到我的应用程序委托类(因为我基本上只想打开按下的键并调用相应的消息在按钮“选择”操作所针对的委托中。
或者,我想我听说过通过将应用程序委托类的超类从 NSObject 更改为 NSView 或 NSResponder 或其他东西来做到这一点。我对这个想法没有太多兴趣,但我不确定如何实际获取应用程序委托对象,然后实际设置为第一响应者(我认为这就是我想要做的)。
所以,我希望有人可以就我应该如何/在何处实现我的 keyDown 方法给我具体的指导,但我也想了解推荐的“最佳实践”是什么。苹果会说什么是做这件事的正确架构?我对学习如何使这项工作像学习其背后的 Apple 设计模式一样感兴趣。
我的程序结构如下: 我有一个 nib 文件(实际上是一个 .xib),我在其中设计了一个带有用于显示的文本框和几个按钮的窗口。我已经将出口和操作从那里注册到 AppDelegate 类(标准项目模板为您设置的类)。遵循 MVC 模式,然后我有一个 AppDelegate 初始化的 Calculator 类,并且计算器的所有实际逻辑都在该类中。 AppDelegate 基本上只是响应来自按钮的消息,将它们传递给 Calculator 类中的方法,然后向 Calculator 询问当前显示值并将其更新回文本框。因此,我的 nib 文件中的图形元素是“视图”,AppDelegate 是“控制器”,Calculator 类是“模型”。对?
那么,谁应该处理 keyDown 事件?看起来视图应该捕获它们并将它们发送到控制器,但是我该如何设置呢?
我想一个可能相关的问题是我已经看到提到“窗口控制器”和“视图控制器”类。我不确定我是否理解这些课程的意义。我的简单应用程序有吗?应该吗?
【问题讨论】:
【参考方案1】:使用NSButton
的setKeyEquivalent:
方法或在界面生成器中为每个按钮设置等效键。
我不确定执行此操作的“正确”方式,但自定义键事件处理可以放在自定义窗口contentView
中,如下所示:
- (void)keyDown:(NSEvent *)theEvent
NSLog(@"keyDown:%@", theEvent);
//Put event handling code here.
[super keyDown:theEvent];
- (BOOL)acceptsFirstResponder
return YES;
如果有人知道这样做的正确方法,请随时加入。
【讨论】:
谢谢,这听起来像是对我的具体问题的最佳答案。我仍然对我关于覆盖 keyDown 方法的正确设计模式的更一般问题的答案感到好奇。 P.S.这解决了几乎所有按钮的问题。我正在制作一个“程序员的计算器”,所以我的一些按钮是两个字符运算符,如“以上是关于响应 keyDown 事件的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章