#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. Спасибо, я пропустил это. Обновление сообщения.