Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 响应按键关闭事件的最佳实践_Macos_Cocoa_Design Patterns_Keydown_Cocoa Design Patterns - Fatal编程技术网

Macos 响应按键关闭事件的最佳实践

Macos 响应按键关闭事件的最佳实践,macos,cocoa,design-patterns,keydown,cocoa-design-patterns,Macos,Cocoa,Design Patterns,Keydown,Cocoa Design Patterns,我正在写我的第一份可可申请书。这是一个简单的实用程序-计算器。我已经让一切正常工作了,我最不想添加的是我希望应用程序能够响应按键事件。所以,你可以用鼠标点击4键,也可以只按键盘上的4键。我正在阅读所有事件处理文档,但没有学习获得处理事件的NSResponder或NSView的推荐方法 我可以创建NSWindow的子类,并告诉界面生成器创建该类型的主窗口。然后,当我在新的NSWindow子类中重写keyDown消息时,它会获取事件,但我不确定如何将其连接到我的应用程序委托类,因为我基本上只想打开按

我正在写我的第一份可可申请书。这是一个简单的实用程序-计算器。我已经让一切正常工作了,我最不想添加的是我希望应用程序能够响应按键事件。所以,你可以用鼠标点击4键,也可以只按键盘上的4键。我正在阅读所有事件处理文档,但没有学习获得处理事件的NSResponder或NSView的推荐方法

我可以创建NSWindow的子类,并告诉界面生成器创建该类型的主窗口。然后,当我在新的NSWindow子类中重写keyDown消息时,它会获取事件,但我不确定如何将其连接到我的应用程序委托类,因为我基本上只想打开按下的键,并调用委托中按钮选择操作目标的对应消息

或者,我想我听说过这样做,将应用程序委托类的超类从NSObject更改为NSView或NSResponder之类。我还没怎么提到这个想法,但我不确定如何实际获取应用程序委托对象,然后将其设置为第一响应者,我想这就是我想要做的

所以,我希望有人能给我具体的指导,告诉我应该如何/在哪里实现我的keyDown方法,但我也想了解推荐的最佳实践是什么。苹果会说什么是这样做的正确架构?我对学习如何使这项工作成功和学习背后的苹果设计模式一样感兴趣

我的课程结构如下: 我有一个nib文件,实际上是一个.xib文件,我在其中设计了一个用于显示的文本框和一手的按钮。我已经注册了AppDelegate类的出口和操作,标准项目模板为您设置了这个类。遵循MVC模式,我有一个由AppDelegate初始化的计算器类,计算器的所有实际逻辑都在这个类中。AppDelegate基本上只响应来自按钮的消息,将它们传递给Calculator类中的方法,然后向计算器请求当前显示值并将其更新回文本框。因此,nib文件中的图形元素是视图,AppDelegate是控制器,Calculator类是模型。对吧?

那么,应该由谁来处理按键事件呢?看起来视图应该捕获它们并将它们发送给控制器,但是如何设置它们呢

我想一个潜在的相关问题是,我已经看到提到了窗口控制器和视图控制器类。我不确定我是否理解这些课程的意义。我的简单应用程序有吗?是否应该?

使用NSButton的setKeyEquivalent:方法或在interface builder中为每个按钮设置等效键

我不确定这样做的正确方法,但自定义键事件处理可以放在自定义窗口contentView中,如下所示:


如果有人知道正确的方法,请随时插话。

谢谢,这听起来是我具体问题的最佳答案。我仍然对我的更一般的问题的答案感到好奇,关于覆盖keyDown方法的正确设计模式是什么。这解决了几乎所有按钮的问题。我正在做一个程序员的计算器,所以我的一些按钮是两个字符的操作符,比如
- (void)keyDown:(NSEvent *)theEvent {
    NSLog(@"keyDown:%@", theEvent);

    //Put event handling code here.

    [super keyDown:theEvent];
}

- (BOOL)acceptsFirstResponder {
    return YES;
}