NSTableView 和 swift:如何在按下箭头时 select 第一行和最后一行 selected?

NSTableView and swift: How to select first row when pushing down arrow and last row is selected?

我有一个很短的问题,无法通过搜索找到答案。

我的程序是用 swift 和 cocoa 编写的简单 mac 程序。我使用 NSTableView class 并且我想使用箭头键在行中上下导航。这直接起作用。但是现在我想要当最后一行被选中并且我按下向下键时第一行被选中。这就像周期性边界条件 ;)

你能帮我解决这个问题吗?或者告诉我应该读什么来处理这样的问题?

非常感谢:)

您可以覆盖 keydown NSTableView。进行新选择后不要忘记滚动。

SWIFT:

import Carbon.HIToolbox.Events

class TableView : NSTableView {

    override func keyDown(with event: NSEvent) {

        if event.characters?.count == 1 {
            let character = event.keyCode
            switch (character) {
            case UInt16(kVK_UpArrow):
                if selectedRow == 0 {
                    selectRowIndexes([numberOfRows - 1], byExtendingSelection: false)
                    scrollRowToVisible(numberOfRows - 1)
                    //scrollToEndOfDocument(nil)
                } else {
                    super.keyDown(with: event)
                }
                break
            case UInt16(kVK_DownArrow):
                if selectedRow == numberOfRows - 1 {
                    selectRowIndexes([0], byExtendingSelection: false)
                    scrollRowToVisible(0)
                    //scrollToBeginningOfDocument(nil)
                } else {
                    super.keyDown(with: event)
                }
            default:
                super.keyDown(with: event)
                break
            }
        } else {
            super.keyDown(with: event)
        }
    }
}

OBJECTIVE-C

#import <Carbon/Carbon.h>
@implementation TableView

- (void)keyDown:(NSEvent *)event
{
    if ([[event characters] length] == 1) {
        unichar code = [event keyCode];
        switch (code)
        {
            case kVK_UpArrow:
            {
                if ([self selectedRow] == 0) {
                    [self selectRowIndexes:[NSIndexSet indexSetWithIndex:[self numberOfRows] - 1] byExtendingSelection:NO];
                    //[self scrollToEndOfDocument:nil];
                    [self scrollRowToVisible:[self numberOfRows] - 1];
                } else {
                    [super keyDown:event];
                }
                break;
            }
            case kVK_DownArrow:
            {
                if ([self selectedRow] == [self numberOfRows] - 1) {
                    [self selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
                    //[self scrollToBeginningOfDocument:nil];
                    [self scrollRowToVisible:0];
                } else {
                    [super keyDown:event];
                }
                break;
            }
            default:
                [super keyDown:event]
                break;
        }
    } else {
        [super keyDown:event];
    }
}

@end