如何在Cocoa应用程序中处理箭头键事件?

14

如何在Cocoa应用程序中处理箭头键事件?

2个回答

12

看这段代码。我假设这个类是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的答案。


1
你还需要成为一个响应者并且在响应者链中。成为一个接受第一响应者的视图是实现这个前提条件的好方法。 - Peter Hosey
@Josh 好的,我明白了。但是我找不到定义的键代码常量值。为了可靠地使用它,需要某种规范。我可以知道官方规范在哪里吗? - eonil
@Eonil:不,你的英语没有问题。我只是担心我的书面语可能听起来像批评,我想明确我并不是这个意图。 :) 我很高兴能分享这些信息!我希望我知道更多,或者更好地理解它,这样我就可以正确地解释它了。 - jscs
1
@Eonil:我刚偶然发现了一个相当新的Cocoa-dev线程,其中讨论了Carbon的各个部分是被弃用还是未被弃用。这为我解决了一些问题;我想你可能会感兴趣。总结如下:GUI Carbon部分被淘汰了,其他大部分都还可以使用,文档应该反映这一点,但做得不够好。 - jscs
@Josh,使用Cocoa中不存在的Carbon特性看起来没问题 :) - eonil
显示剩余3条评论

3
在我的情况下,我希望一个已呈现的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,适用于一些边缘情况,当响应者链不按照您的意愿工作时。 - w0mbat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接