【问题标题】:NSTableView NOT responding to up/down arrow keysNSTableView 不响应向上/向下箭头键
【发布时间】:2016-08-23 07:41:09
【问题描述】:

我有一个不响应向上/向下箭头键的 NSTableView。据我了解,响应是默认行为,所以我不确定发生了什么(注意,我没有覆盖任何键盘命令)。我为我的桌子做的唯一设置是:

[tableView setDoubleAction: @selector(doubleClickedRow)];
[tableView setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[tableView registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
[tableView setDraggingSourceOperationMask: NSDragOperationCopy forLocal:NO];

但据我所知,这些都不会造成任何问题。

有人对我可以在哪里寻找这个问题的根源有任何建议吗?

【问题讨论】:

  • 笔尖中设置的refusesFirstResponder 的值是多少?
  • 你可以点击一行来选择它吗?它会突出显示吗?在我的表格视图中,我可以开始使用向上和向下箭头。
  • 是的,我可以点击该行来选择它。然后,一旦我尝试按错误键,什么也没有发生。我今晚会检查refusesFirstResponder 的值。

标签: cocoa nstableview arrow-keys


【解决方案1】:

如果包含表格的 NSWindow 不是键窗口,则 NSTableView 也会对箭头键无响应。

我最近遇到的一种情况是,如果未在 Interface Builder 中设置 NSWindow 的“标题栏”外观选项:这会更改 NSWindow 的默认行为以拒绝键状态。见-[NSWindow canBecomeKeyWindow]

因此,即使 NSWindow 显示为没有标题栏的模式表,也必须设置标题栏选项,否则关键事件不会到达 NSTableView。

【讨论】:

    【解决方案2】:

    您是否在任何地方覆盖了keyDown:?在自定义 NSTableView 子类中还是在窗口控制器中?这可能是箭头键在您的表格中不起作用的原因。

    我在自定义表格视图中遇到了同样的问题。我通过调用 super 的箭头键来解决它,让表格处理事件:

    @implementation ILCustomTableView
    
    - (void)keyDown:(NSEvent *)theEvent 
    {
        if ([theEvent modifierFlags] & NSNumericPadKeyMask)
        {
            [super keyDown:theEvent];    // Let table view handle arrow keys
        } else {
    
            [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];        
        }
    }
    
    - (void)insertNewline:(id)sender
    {
        // Enter key. Do special stuff here...
    }
    @end
    

    【讨论】:

      【解决方案3】:

      我有一个不响应向上/向下箭头键的 NSTableView。 据我了解,这是默认行为

      这不是默认行为。 NSTableView 确实处理键盘事件并允许使用光标键进行导航。

      也许您可以使用以下问题中的技巧来调试响应者链: How to inspect the responder chain?

      【讨论】:

      • 嗯? “这不是默认行为”似乎与“NSTableView 确实处理键盘事件”相矛盾。
      • 如果我正确理解了这个问题,Zenox 假设 NSTableView 不处理键盘事件。这个假设是错误的。 NSTableView 的默认实现提供键盘导航。
      【解决方案4】:

      刚遇到这个问题,我发现这一行会阻止向上/向下箭头键正确选择行。

      [self.tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];

      我试图使用我自己的背景颜色,所以我添加了它。当我点击向上/向下时,它触发了shouldSelectRow:,但它始终为0!注释掉上面的行为我修复了它。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,使用箭头键时,我的 tableview 的代表没有收到更改通知。

        这是我的 Swift 解决方案:

        先继承 NSTableView,然后重写这个方法。

        override func keyDown(theEvent: NSEvent) {
            super.keyDown(theEvent)
            let code=theEvent.keyCode
            if code >= 123 && theEvent.keyCode <= 126 {
                if let target=target{
                    target.performSelector(action)
                }
            }
        }
        

        123到126码分别是左、右、下、上

        【讨论】:

          最近更新 更多