NSTableView и swift: Как выбрать первый ряд при нажатии стрелки вниз и последний ряд выбран? - PullRequest
0 голосов
/ 06 марта 2019

У меня очень короткий вопрос, и я не могу найти ответ с помощью поиска.

Моя программа - простая mac-программа, написанная на swift и какао. Я использую класс NSTableView и хочу перемещаться вверх и вниз по строкам с помощью клавиш со стрелками. Это работает напрямую. Но теперь я хочу, чтобы при выборе последней строки и нажатии клавиши «вниз» выбиралась первая строка. Это как периодические граничные условия;)

Можете ли вы помочь мне с этой проблемой? Или скажите мне, что я должен прочитать, чтобы справиться с такой проблемой?

Большое спасибо:)

1 Ответ

2 голосов
/ 06 марта 2019

Вы можете переопределить нажатие клавиши 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...