【发布时间】:2011-08-25 09:38:06
【问题描述】:
Cocoa 应用中如何处理方向键事件?
【问题讨论】:
标签: cocoa keyboard-events
Cocoa 应用中如何处理方向键事件?
【问题讨论】:
标签: cocoa keyboard-events
查看此代码。我假设该类是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 子类的其他答案处理。
【讨论】:
在我的例子中,我想要一个提供的 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];
【讨论】: