NSTableView使用箭头键导航

时间:2010-05-05 22:46:27

标签: cocoa navigation nstableview arrow-keys

如何使用箭头键浏览表格视图。与setAction:setDoubleAction非常相似,但不是对点击作出反应,而是通过在桌子上向上或向下移动的箭头键做出反应。

4 个答案:

答案 0 :(得分:7)

在表格视图委托中,实施tableView:shouldSelectRow:。做任何你想做的事,然后返回YES。当您在表格视图中选择项目时,它会被触发。

答案 1 :(得分:3)

我不确定你的意思是因为当我在桌子上选择某些东西时,我可以使用箭头键在桌子中上下移动。但是如果你想更多地定制行为我有一个解决方案。在我的一个应用程序中,我想检测何时按下return或enter键,然后相应地执行一些操作。我创建了一个新类,并使其成为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
        }
    }
}

答案 2 :(得分:2)

AHA!这样做是不是意外地打破了NSTableView?

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

   [super keyDown:event];
}
@end

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

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

这种错误使得使用NSTableView非常令人沮丧。 也许Apple可以在静态分析仪中检测到这种情况?

答案 3 :(得分:0)

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

点击表格行可以做两件事。

  1. TRIES选择表格行(有时表格行可以选择REFUSE,这就是为什么有“shouldSelect”委托方法)。

  2. 如果发生了新选择,则执行操作(将tableView作为发件人)。在那里,您可以向表格询问当前的选择,并随心所欲地做任何事情。

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

    在你的情况下---我建议的是你实施

    selectionDidChange:(NSNotigivation)通知;

    NSTableView委托调用。这称为AFTER选择已更改,然后您知道新的当前选择,并对所选项目执行任何操作。