我有一个包含多行的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];
}
}
答案 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];