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

问题描述 投票:-1回答:1

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

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

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

非常感谢你 :)

swift macos cocoa nstableview
1个回答
2
投票

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

迅速:

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
© www.soinside.com 2019 - 2024. All rights reserved.