如何将键盘向上/向下事件从 NSTextField 转发到 NSTableView?

Cam*_*oft 5 keyboard macos cocoa nsevent nstableview

我正在尝试模拟 Spotlight 在 Yosemite 中的工作方式,其中 NSTextField(搜索字段)在按下向上/向下箭头键并上下移动表格视图选择时始终保持焦点。

\n\n

我已经实现了以下代码:

\n\n
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector\n{\n    if (commandSelector == @selector(moveUp:)) {\n        // move up\n        return YES;\n    } else if(commandSelector == @selector(moveDown:)){\n        // move down\n        return YES;\n    }\n\n    return NO;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然我可以使用它来向上/向下移动行选择,例如:

\n\n
[self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:currentRow \xc2\xb1 1] byExtendingSelection:NO];\n
Run Code Online (Sandbox Code Playgroud)\n\n

我遇到的问题是我创建了不应选择的节标题行,并且我已使用 NSTableViewDelegate 方法禁用了对这些行的选择:

\n\n
- (BOOL)tableView: (NSTableView *)tableView shouldSelectRow: (NSInteger)row\n
Run Code Online (Sandbox Code Playgroud)\n\n

但发生的情况是selectRowIndexes:indexSetWithIndex:currentRowbyExtendingSelection:即使委托方法表明无法选择该行,该方法也会选择标题行。

\n\n

无论 NSTableViewDelegate 说什么,您似乎仍然可以以编程方式选择行。我想要的是选择跳过标题行。

\n\n

如果 NSTableView 是firstResponder则内置键盘控件会跳过标题行。

\n\n

所以我的问题是有没有办法将向上/向下事件转发到 NSTableView 以便移动选择的内置机制起作用?

\n

小智 4

以下对我有用,但我不确定是否有任何副作用。

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
    if (commandSelector == @selector(moveUp:)) {
        // move up
        [_tableView keyDown:[NSApp currentEvent]];
        return YES;
    } else if(commandSelector == @selector(moveDown:)){
        // move down
        [_tableView keyDown:[NSApp currentEvent]];
        return YES;
    }

    return NO;
}
Run Code Online (Sandbox Code Playgroud)