【问题标题】:How to handle arrow key event in Cocoa app?如何处理 Cocoa 应用程序中的箭头键事件?
【发布时间】:2011-08-25 09:38:06
【问题描述】:

Cocoa 应用中如何处理方向键事件?

【问题讨论】:

    标签: cocoa keyboard-events


    【解决方案1】:

    查看此代码。我假设该类是NSView 的子类。

    #pragma mark    -   NSResponder
    
    - (void)keyDown:(NSEvent *)theEvent
    {
        NSString*   const   character   =   [theEvent charactersIgnoringModifiers];
        unichar     const   code        =   [character characterAtIndex:0];
            
        switch (code) 
        {
            case NSUpArrowFunctionKey:
            {
                break;
            }
            case NSDownArrowFunctionKey:
            {
                break;
            }
            case NSLeftArrowFunctionKey:
            {
                [self navigateToPreviousImage];
                break;
            }
            case NSRightArrowFunctionKey:
            {
                [self navigateToNextImage];
                break;
            }
        }
    }
    

    视图应该是接收事件的第一响应者。也许需要这段代码来支持它。

    #pragma mark    -   NSResponder
    - (BOOL)canBecomeKeyView
    {
        return  YES;
    }
    - (BOOL)acceptsFirstResponder
    {
        return  YES;
    }
    

    要使用这个方法,类应该是NSResponder的子类。请参阅不使用 NSResponder 子类的其他答案处理。

    【讨论】:

    • 您还需要成为响应者并处于响应者链中。成为接受第一响应者的视图是满足此先决条件的好方法。
    • 关键代码自古以来一直是相同的,不太可能改变。请参阅 Peter Hosey 的this informative article。它们仅在 Carbon 标头中对我们可见这一事实并没有多大意义。 CGEvents 主要使用它们,而不是相应的 unicode。
    • @Josh 好的。我明白了。但我找不到定义的关键代码常量值。为了可靠地使用它,需要某种规范。我能知道官方规范在哪里吗?
    • @Eonil:请理解我并不是说你的方法有什么问题根本。我只是想展示一个不同的。
    • @Eonil:刚刚偶然发现a fairly recent Cocoa-dev thread,它谈到了 Carbon 各个部分的弃用/不弃用。它为我清除了一些东西;以为你可能会感兴趣。总结是:GUI Carbon 的东西已经过时了,其他大部分都还可以,文档应该反映这一点,但做得并不好。
    【解决方案2】:

    在我的例子中,我想要一个提供的 NSViewController 子类,以便能够以最小的努力收听用于导航的箭头键事件。这是我找到的最佳解决方案,与 Josh Caswell 的回答略有不同。

    定义一个事件监视器(可选),可以在你本地的 NSViewController 子类.m中

    id keyMonitor;
    

    然后开始监控事件,例如在 viewDidLoad 中。

    keyMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *event) {
    
        unichar character = [[event characters] characterAtIndex:0];
        switch (character) {
            case NSUpArrowFunctionKey:
                NSLog(@"Up");
                break;
            case NSDownArrowFunctionKey:
                NSLog(@"Down");
                break;
            case NSLeftArrowFunctionKey:
                NSLog(@"Left");
                break;
            case NSRightArrowFunctionKey:
                NSLog(@"Right");
                break;
            default:
                break;
        }
        return event;
    }];
    

    在不需要时移除监视器(假设您已定义它)

    [NSEvent removeMonitor:keyMonitor];
    

    【讨论】:

    • 这是一个非常有用的 API,适用于响应者链无法执行您想要的某些极端情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多