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

问题描述 投票:4回答:2

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

我实现了以下代码:

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

    return NO;
}

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

[self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:currentRow ± 1] byExtendingSelection:NO];

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

- (BOOL)tableView: (NSTableView *)tableView shouldSelectRow: (NSInteger)row

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

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

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

所以我的问题是,有没有一种方法可以将向上/向下事件转发到NSTableView,从而使移动选择的内置机制起作用?

macos cocoa keyboard nstableview nsevent
2个回答
3
投票

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

- (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;
}

0
投票

您的-control:textView:doCommandBySelector:方法应该在控制器中,该控制器可以是表视图的委托或数据源,或者可以访问它们。因此,它可以只检查是否应该以与委托方法相同的方式选择该行。 (您可以直接调用委托方法,但不一定必须如此。)

如果该方法不在此类控制器中,则应将请求转发到该控制器。

© www.soinside.com 2019 - 2024. All rights reserved.