Редактирование NSTableView и NSOutlineView с помощью клавиши табуляции

В моем приложении есть NSOutlineView и NSTableView , а я У меня одинаковая проблема с обоими. Если строка в любом из выбранных, нажатие клавиши табуляции переводит первый столбец в режим редактирования вместо того, чтобы сделать следующий ключевой вид первым отвечающим. Чтобы перейти к следующему ключевому представлению, вам нужно пройти через все столбцы.

Кроме того, Shift-Tabbing в любом из представлений приводит к тому, что столбец последний переходит в режим редактирования, что требует дополнительных вкладок Shift-Tab для перехода к предыдущему ключевому представлению.

В случае, если это имеет значение, я использую автоматически вычисляемый ключ цикл просмотра, не мой собственный, с моим NSWindow , установленным на , автопересчет KeyViewLoop = YES . Я хотел бы использовать табуляцию между столбцами после того, как пользователь выберет редактирование столбца, но я не думаю, что это стандартное поведение клавиши табуляции для триггера режима редактирования.

Обновление

Благодаря полезные ответы ниже, я разобрался. По сути, я переопределяю -keyDown в моем собственном классе табличного представления, который обрабатывает табуляцию и сдвиг-табуляцию вне табличного представления. Однако было сложнее решить проблему сдвига табуляции в табличном представлении. Я установил логическое свойство на YES в пользовательском табличном представлении -acceptsFirstResponder , если он принимает управление от другого представления.

-tableView делегата: shouldEditTable133127: row проверяет это, когда текущим событием является событие Shift-Tab keyDown . -tableView: shouldEditTableColumn: row вызывается, и это не событие смены табуляции, оно устанавливает для свойства табличного представления значение NO , чтобы его можно было редактировать как обычно.

Я вставил полное решение ниже.

/* CustomTableView.h */

@interface CustomTableView : NSTableView {}

@property (assign) BOOL justFocused;

@end

/* CustomTableView.m */

@implementation CustomTableView

@synthesize justFocused;

- (BOOL)acceptsFirstResponder {
    if ([[self window] firstResponder] != self) {
        justFocused = YES;
    }

    return YES;
}

- (void)keyDown:(NSEvent *)theEvent
{
    // Handle the Tab key
    if ([[theEvent characters] characterAtIndex:0] == NSTabCharacter) {
        if (([theEvent modifierFlags] & NSShiftKeyMask) != NSShiftKeyMask) {
            [[self window] selectKeyViewFollowingView:self];
        } else {
            [[self window] selectKeyViewPrecedingView:self];
        }
    }
    else {
        [super keyDown:theEvent];
    }
}

@end

/* TableViewDelegate.m */

. . .

- (BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn
              row:(NSInteger)row
{
    NSEvent *event = [NSApp currentEvent];
    BOOL shiftTabbedIn = ([event type] == NSKeyDown
                          && [[event characters] characterAtIndex:0] == NSBackTabCharacter);

    if (shiftTabbedIn && ((CustomTableView *)tableView).justFocused == YES) {
        return NO;
    } else {
        ((CustomTableView *)tableView).justFocused = NO;
    }

    return YES;
}

. . .
6
задан Dov 9 April 2011 в 12:03
поделиться