NSResponder 定义了许多与键盘操作相关的操作moveUp:
,例如moveUpAndModifySelection:
和moveToBeginningOfLine:
。除了按修饰键(例如moveUp:
只是Up
箭头键)未触发的操作外,我无法在我的 custom 上调用任何操作NSView
。
这是设置:
- Xcode 5.1 / 10.9
- 基本的 Cocoa 应用程序,仅
Custom View
添加到主窗口。 - 这个自定义视图只是一个
NSView
类STView
STView
无非是覆盖acceptsFirstResponder
返回YES
在此设置中,我的STView
实例将正确接收所有键盘事件(包括具有修饰符的事件Ctl-A
,performKeyEquivalent:
如keyDown:
预期的那样。(这两种方法都已在下面的讨论中注释掉。)
如果我提供了一个实现,那么当用户按下箭头键时会正确调用thenmoveUp:
中定义的。NSResponder
moveUp:
Up
令人困惑的moveUp:
是,只要Up
使用修饰键按下箭头键,也会调用它。当按住修饰键时(例如:)Ctl-Up
,我希望调用适当的键盘操作方法。
前任:
Ctl-Up
->moveUp:
(预期scrollPageUp:
:)Alt-Up
->moveUp:
(预期moveToBeginningOfParagraph:
:)Shift-Up
->moveUp:
(预期moveUpAndModifySelection:
:)Command-Up
->moveUp:
(预期moveToBeginningOfDocument:
:)
对于所有键/修饰符组合,此模式会重复。
Apple 文档中的两个方面似乎相关:
通读该文档,系统似乎负责将关键事件映射到相应的关键操作。事实上,当没有按下修饰键时,这对我有用。但是当按下修饰键时,事件就像任何其他事件一样被处理并通过正常的响应者链传递。
(我可以看到修饰键事件通过NSApplication sendEvent
,尽管NSApplication sendAction:to:from:
从未被调用,并继续沿视图层次结构向下移动,鉴于我阅读了上面的文档,我希望这一点。
文档提示文本编辑视图可能会被区别对待。这些键盘操作是否仅发送到编辑文本的视图?如果没有,那么当用户按下时,如何moveUpAndModifySelection:
在他们的自定义类上得到一条消息?NSView
Shift-Up
作为参考,我将此图表用于键盘绑定,但坦率地说,我已经尝试了几乎所有组合,无论是否列出:
归根结底,我可能只是重写keyDown:
并手动处理我感兴趣的所有组合,但我希望至少能理解为什么这对我来说不起作用。
(请注意,此处的预期应用程序是允许用户导航项目的类似网格的视图,很像集合视图。)
任何提示、建议或意见将不胜感激。
更新:
如果您在您的keyDown
- (void)keyDown:(NSEvent *)theEvent {
...
[self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
}
然后将在您的自定义视图上调用“正确”操作。我认为这是因为我感兴趣的动作是类似文本的动作,它需要输入管理器解释并转换为适当的动作。
我仍然不完全清楚为什么moveUp:
正确地被调用。响应者链中的谁在识别Up
被按下的箭头键然后发送moveUp:
消息?