Cocoa 使用'模拟箭头键;j';和';k';在一个静态视图中?

Cocoa 使用'模拟箭头键;j';和';k';在一个静态视图中?,cocoa,event-handling,Cocoa,Event Handling,我有一个多行的NSTableView。allowsEmptySelection属性为“否”,因此始终选择一行。我可以按预期使用箭头键在tableview上下移动 我也希望能够用“j”和“k”键上下移动。我已经查看了,但不知道如何使这些键模拟向上和向下箭头键 值得一提的是,以下是我目前正在做的事情。我不是真的“模拟箭头键”。相反,当按下“j”和“k”时,我只是在做我想要的行为。很好,但我想知道是否有更好的方法 - (void)keyDown:(NSEvent *)theEvent { NS

我有一个多行的NSTableView。allowsEmptySelection属性为“否”,因此始终选择一行。我可以按预期使用箭头键在tableview上下移动

我也希望能够用“j”和“k”键上下移动。我已经查看了,但不知道如何使这些键模拟向上和向下箭头键

值得一提的是,以下是我目前正在做的事情。我不是真的“模拟箭头键”。相反,当按下“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];
    }
}
-(void)向下键:(n事件*)事件{
NSInteger行=[self.tableView selectedRow];
NSInteger numRows=[self.tableView numberOfRows];
开关([theEvent keyCode]){
案例38://“j”
如果(行0){
[self.tableView-selectRowIndexes:[NSIndexSet-IndexBethIndex:row-1]通过扩展选择:否];
}
打破
违约:
[super keyDown:theEvent];
}
}

创建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键,将向上或向下添加选择

如果您选择使用此代码,请确保在按下任何其他修改器时过滤掉,并将其传递给super。我这样做不是为了让它更具可读性

编辑:如何创建假事件

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];

我尝试了此操作,但出现以下错误:-[MyTableView moveUp:]:无法识别的选择器发送到实例0x100148270。显然它找不到-moveUp/-moveDown。有什么想法吗?请注意,
moveUp:
moveUp
(不带冒号)是不同的方法名。ughoavgfhw的示例代码假设您已经定义了类似
-(void)moveUp:(id)sender
-(void)moveDown:(id)sender
@NSGod这样的方法:它们是处理箭头键的预定义方法,而不是假设。NSTableView不能使用它们。你可以尝试创建一个带有箭头键代码的假事件,并将其传递给super(我将在更新中演示如何进行)。对于我来说,j和k似乎分别为38和40。另外,使用
moveUp:
moveDown:
似乎对我不起作用。但是,创建一个新的
NSEvent
似乎能如期工作。