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

前端之家收集整理的这篇文章主要介绍了macos – 如何将键盘上/下事件从NSTextField转发到NSTableView?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试模拟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];

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

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

但是,即使委托方法表明无法选择行,selectRowIndexes:indexSetWithIndex:currentRowbyExtendingSelection:方法也会选择标题行.

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

如果NSTableView是第一个响应者,则内置键盘控件会跳过标题行.

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

解决方法

以下适用于我,但我不确定是否有任何副作用.

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

猜你在找的cocoa相关文章