【问题标题】:How to forward keyboard up/down events from NSTextField to a NSTableView?如何将键盘向上/向下事件从 NSTextField 转发到 NSTableView?
【发布时间】:2015-05-12 01:59:05
【问题描述】:

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

我已经实现了以下代码:

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

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

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

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

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

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

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

【问题讨论】:

    标签: macos cocoa keyboard nstableview nsevent


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      如果该方法不在这样的控制器中,它应该将请求转发到该控制器。

      【讨论】:

        猜你喜欢
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 2016-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多