NSTableView и swift: как выбрать первую строку при нажатии стрелки вниз и выделена последняя строка?

#swift #macos #cocoa #nstableview

#swift #macos #cocoa #nstableview

Вопрос:

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

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

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

Большое вам спасибо 🙂

Ответ №1:

Вы можете переопределить 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
  

Комментарии:

1. Большое вам спасибо! Это действительно помогло 🙂 Всего 2 замечания: 1) super.keyDown () также необходим для UpArrow 2) Для выбора последней строки необходимо иметь selectRowAtIndexes ([numberOfRows-1]) В противном случае это было идеально и работало напрямую! Большое спасибо 🙂

2. Спасибо, я пропустил это. Обновление сообщения.