gpt4 book ai didi

objective-c - 为什么不调用 NSResponder 的键盘操作?

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:05 24 4
gpt4 key购买 nike

NSResponder 定义了许多与键盘操作相关的操作,例如 moveUp: , moveUpAndModifySelection:moveToBeginningOfLine: .除了不是通过按修饰键触发的操作(例如 moveUp: 只是 Up 箭头键)之外,我无法在我的自定义 NSView 上调用任何操作.

这是设置:

  • Xcode 5.1/10.9
  • 基本的 Cocoa 应用程序只有一个 Custom View添加到主窗口。
  • 这个自定义 View 只是一个 NSView类(class)STView
  • STView无非是覆盖 acceptsFirstResponder返回 YES

  • 在这个设置中,我的 STView实例将正确接收所有键盘事件(包括那些在 Ctl-AperformKeyEquivalent: 中都带有类似 keyDown: 修饰符的事件,正如预期的那样。(这两种方法都被注释掉以供下面的讨论。)

    如果我为 moveUp: 提供一个实现,如 NSResponder 中所定义然后 moveUp:当用户按下 Up 时被正确调用箭头键。

    令人困惑的是, moveUp:每当 Up 时也被调用箭头键是用修饰键按下的。当按住修饰键时(例如: Ctl-Up ),我希望调用适当的键盘操作方法。

    前任:
  • Ctl-Up -> moveUp: (预期:scrollPageUp:)
  • Alt-Up -> moveUp: (预期:moveToBeginningOfParagraph:)
  • Shift-Up -> moveUp: (预期:moveUpAndModifySelection:)
  • Command-Up -> moveUp: (预期:moveToBeginningOfDocument:)

  • 对于所有键/修饰符组合,这种模式都会重复。

    Apple 文档中的两个方面似乎相关:
  • Handling Keyboard Actions and Inserting Text
  • The Path of Key Events

  • 通读该文档,系统似乎负责将关键事件映射到相应的关键操作。事实上,当没有按下修饰键时,这对我有用。但是当按下修饰键时,该事件就像任何其他事件一样被处理并通过正常的响应者链传递。

    (我可以看到修饰键事件通过 NSApplication sendEvent 进入,尽管 NSApplication sendAction:to:from: 从未被调用,并继续向下查看 View 层次结构,鉴于我阅读了上述文档,我期望这样做。

    文档提示文本编辑 View 可能会被区别对待。这些键盘操作是否仅发送到编辑文本的 View ?如果没有,那么如何获得类似 moveUpAndModifySelection: 的消息?被称为他们的自定义 NSView当用户按下 Shift-Up 时的类?

    作为引用,我将此图表用于键盘绑定(bind),但坦率地说,我已经尝试过几乎所有组合,无论是否列出:
  • Default Mac OS X System Key Bindings

  • 归根结底,我可能只是覆盖 keyDown:并手动处理我感兴趣的所有组合,但我希望至少了解为什么这对我来说不起作用。

    (请注意,这里的预期应用程序是允许用户导航类似网格的项目 View ,很像 Collection View 。)

    任何提示、建议或意见将不胜感激。

    更新:

    如果您在 keyDown 中执行以下操作
    - (void)keyDown:(NSEvent *)theEvent {
    ...
    [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
    }

    然后将在您的自定义 View 上调用“正确”操作。我认为这是因为我感兴趣的 Action 是类似文本的 Action ,它需要输入管理器来解释并转换为适当的 Action 。

    我仍然不完全清楚为什么 moveUp:被正确地调用。响应者链中的谁正在识别 Up箭头键被按下然后发出 moveUp:信息?

    最佳答案

    这是对您的自我回答的一种回复,它更像是问题的延伸。

    是的,大多数情况下需要调用-[NSResponder interpretKeyEvents:]-[NSTextInputContext handleEvent:]获取键绑定(bind)系统向您发送绑定(bind)操作方法。

    至于你为什么会收到 -moveUp: ,我在一个简单的自定义 View 类中实现了以下内容:

    - (BOOL) acceptsFirstResponder
    {
    return YES;
    }

    - (void) moveUp:(id)sender
    {
    NSLog(@"%@", [NSThread callStackSymbols]);
    }

    记录了以下调用堆栈:
    0   TestKeyUp                           0x000000010000182d -[KeyView moveUp:] + 48
    1 AppKit 0x00007fff85e44012 -[NSWindow _processKeyboardUIKey:] + 325
    2 AppKit 0x00007fff85ab1075 -[NSWindow keyDown:] + 94
    3 AppKit 0x00007fff8589e206 forwardMethod + 104
    4 AppKit 0x00007fff8589e206 forwardMethod + 104
    5 AppKit 0x00007fff8596c0c7 -[NSWindow sendEvent:] + 8769
    6 AppKit 0x00007fff858a0afa -[NSApplication sendEvent:] + 4719
    7 AppKit 0x00007fff858376de -[NSApplication run] + 474
    8 AppKit 0x00007fff858303b0 NSApplicationMain + 364
    9 TestKeyUp 0x000000010000176d main + 33
    10 TestKeyUp 0x0000000100001744 start + 52
    11 ??? 0x0000000000000001 0x0 + 1
    NSWindow处理向上箭头键作为“键盘界面控制”的一部分。这是 partially documented ,但并没有明确它会调用诸如 -moveUp: 之类的方法.显然,这就是它的实现方式。

    关于objective-c - 为什么不调用 NSResponder 的键盘操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22725329/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com