在NSTableView中使用'j'和'k'模拟箭头键?

时间:2010-12-14 00:28:43

标签: cocoa event-handling

我有一个包含多行的NSTableView。 allowsEmptySelection属性为NO,因此始终选择一行。我可以按预期使用箭头键在桌面视图中上下移动。

我也希望能够使用' j'和' k'键。我查看了Cocoa Event-Handling Guide,但无法弄清楚如何使这些键模拟向上和向下箭头键。

对于它的价值,这就是我目前正在做的事情。我并不是真的在模拟箭头键'。相反,我只是做了我想要的行为,而不是' j'和' k'被压了。没关系,但我想知道是否有更好的方法......

- (void)keyDown:(NSEvent *)theEvent {
    NSInteger row = [self.tableView selectedRow];
    NSInteger numRows = [self.tableView numberOfRows];
    switch ([theEvent keyCode]) {
        case 38:   // 'j'
            if (row < numRows - 1) {
                [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row+1] byExtendingSelection:NO];
            }
            break;
        case 40:   // 'k'
            if (row > 0) {
                [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row-1] byExtendingSelection:NO];
            }
            break;
        default:
            [super keyDown:theEvent];
    }
}

1 个答案:

答案 0 :(得分:2)

创建NSTableView的自定义子类以捕获事件。您的子类应该包含此方法:

- (void)keyUp:(NSEvent *)event {
    if([event keyCode] == 26) {//J
        if([event modifierFlags] & NSShiftKeyMask) [self moveDownAndModifySelection:nil];
         else [self moveDown:nil];
    } else if([event keyCode] == 28) {//K
        if([event modifierFlags] & NSShiftKeyMask) [self moveUpAndModifySelection:nil];
         else [self moveUp:nil];
    } else [super keyUp:event];
}

这将捕获任何J或K键并告诉表视图分别向上或向下移动。此外,如果按下shift键,则会向上或向下添加选择。

如果您选择使用此代码,请确保在按下任何其他修改器时过滤掉并将其传递给超级。我没有这样做,以使其更具可读性。

编辑:如何创建错误事件

unichar theChar = NSUpArrowFunctionKey; //NSDownArrowFunctionKey
NSString *string = [NSString stringWithCharacters:&theChar length:1];
NSEvent *newEvent =[NSEvent keyEventWithType:NSKeyUp location:[event locationInWindow] modifierFlags:[event modifierFlags] timestamp:[event timestamp] windowNumber:[event windowNumber] context:nil/*get graphics context if you want*/ characters:string charactersIgnoringModifiers:string isARepeat:[event isARepeat] keyCode:theChar];
[super keyUp:newEvent];