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

标签 cocoa event-handling

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

我还希望能够使用“j”和“k”键上下移动。我看过Cocoa Event-Handling Guide ,但不知道如何让这些键模拟向上和向下箭头键。

就其值(value)而言,这就是我目前正在做的事情。我并不是真的在“模拟箭头键”。相反,我只是在按下“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];
    }
}

最佳答案

创建 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 键并分别告诉 TableView 向上或向下移动。另外,如果按下 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];

关于cocoa - 在 NSTableView 中用 'j' 和 'k' 模拟箭头键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4434820/

相关文章:

javascript - jquery 或 js 事件处理程序?

macos - 具有多个文本字段的 NSTableview 列

objective-c - 使用 Objective-C 可缩放/调整大小的网格

cocoa - 使 NSView 具有固定宽度和可变高度以适应内容

swift - NSCollectionView - 自定义 View 项未连接或不会选择

validation - Backbone - 未调用模型验证且未捕获 "invalid"事件

objective-c - 将字符串 ("MyExampleClass") 转换为类名 (MyExampleClass)

reactjs - react-sortable-hoc : Handling of click event on list item

Javascript 调试 : pause on click event

android - 处理菜单项点击事件 - Android