gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:44:04 25 4
gpt4 key购买 nike

我有一个包含多行的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com