【问题标题】:NSTableView navigate with arrow keysNSTableView 使用箭头键导航
【发布时间】:2023-11-19 19:11:01
【问题描述】:

如何使用箭头键浏览我的表格视图。很像 setAction:setDoubleAction,但不是对点击做出反应,而是对在表格中上下移动的箭头键做出反应。

【问题讨论】:

  • 这个问题毫无意义。请你再读一遍好吗?您想对浏览您的表格视图的人做出反应吗?
  • 是的。很像 setAction 如何处理点击,但我想要类似的东西来处理箭头键
  • 箭头键“正常工作”,不需要额外的。

标签: cocoa navigation nstableview arrow-keys


【解决方案1】:

在您的表视图委托中,实现tableView:shouldSelectRow:。随心所欲,然后返回YES。当您在表格视图中选择项目时,它会被触发。

【讨论】:

  • 在尝试这个解决方案时,我发现当你用箭头键上下移动时,即使 shouldSelectRow 每次都回答 YES,我的 tableViewSelected 方法也没有被调用。我最终做的是从 tableViewSelected 和 shouldSelectRow 中调用一个单独的例程来执行每次焦点更改时所需的其他显示方面。我想这就是“随心所欲”的答案的意思。
【解决方案2】:

我不确定您的意思,因为当我在表格中选择某些内容时,我可以使用箭头键在表格中上下移动。但是,如果您想更多地自定义行为,我有一个解决方案。在我的一个应用程序中,我想检测何时按下返回或回车键,然后相应地执行一些操作。我创建了一个新类并将其设为 NSWindow 的子类。在界面生成器中,我将主窗口设置为此类。然后我覆盖该子类中 NSWindow 的 keyDown: 方法。因此,只要我的主窗口位于最前面(第一响应者),就会检测到按键并通过该方法进行过滤。我相信你可以为箭头按下做类似的事情。您可能希望使您的类成为 NSTableView 而不是 NSWindow 的子类,具体取决于您希望如何捕捉按键。我希望它适用于整个应用程序,但您可能希望它仅在表格视图是第一响应者时才起作用。

- (void)keyDown:(NSEvent *)theEvent {
    if ([theEvent type] == NSKeyDown) {
        NSString* characters = [theEvent characters];
        if (([characters length] > 0) && (([characters characterAtIndex:0] == NSCarriageReturnCharacter) || ([characters characterAtIndex:0] == NSEnterCharacter))) {
            // do something here when return or enter is pressed
        }
    }
}

【讨论】:

  • 我不明白为什么人们不明白我在问什么。我想要做的就是使用箭头键来代替点击。因此,如果我向下箭头到第 x 行,它将执行类似于 setAction 的单击操作
【解决方案3】:

啊哈!这样做是不是不小心破坏了 NSTableView?

@implementation NSTableView ( DeleteKeyCategory )
-( void ) keyDown: ( NSEvent * ) event
{
   // ... do something ...

   [super keyDown:event];
}
@end

对我来说,这具有替换 NSTableView 的 keyDown: 例程的不良副作用,它破坏了光标键。 (有点像调酒)

我学到的教训: - 完全避免 keyDown: 例程。 - 从长远来看,继承 Apple NSControls 将节省工作量。

这是使使用 NSTableView 非常令人沮丧的错误类型。 也许苹果可以在静态分析器中检测到这种东西?

【讨论】:

  • 是的,这就是我在这里的原因 ;) 我忘了叫 super
【解决方案4】:

箭头用于选择,不用于执行任何操作。将应用于所选项目的操作通常由 TableView 的“action”或“doubleAction”属性设置。

点击表格行有两种不同的作用。

  1. 尝试选择表格行(有时表格行可以拒绝被选择,这就是为什么有一个“shouldSelect”委托方法)。

  2. 如果发生新的选择,则执行操作(将 tableView 作为发送者)。在那里,您可以向桌子询问当前的选择,并根据需要做任何事情。

请考虑当有几个选定的行,或选定的列,或许多其他复杂情况时的情况。

在您的情况下 --- 我建议您实施

selectionDidChange:(NSNotigivation)通知;

NSTableView 委托调用。这称为 AFTER selection has changed,此时您知道新的当前选择,并对所选项目执行任何您想要的操作。

【讨论】: