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