Вкладка NSTableView для перехода от строки к строке во время редактирования

У меня есть NSTableView. Во время редактирования, если я нажму вкладку, я автоматически перескочу к следующему столбцу. Это замечательно, но когда я редактирую поле в последнем столбце и нажимаю вкладку, я хочу, чтобы фокус перешел к первому столбцу СЛЕДУЮЩЕЙ строки.

Какие-либо предложения?

Спасибо Майклу за начальный код, он был очень близок к тому, что в итоге заработало! Вот окончательный код, который я использовал, надеюсь, он будет полезен кому-то еще:

- (void) textDidEndEditing: (NSNotification *) notification {
    NSInteger editedColumn = [self editedColumn];
    NSInteger editedRow = [self editedRow];
    NSInteger lastColumn = [[self tableColumns] count] - 1;

    NSDictionary *userInfo = [notification userInfo];

    int textMovement = [[userInfo valueForKey:@"NSTextMovement"] intValue];

    [super textDidEndEditing: notification];

    if ( (editedColumn == lastColumn)
        && (textMovement == NSTabTextMovement)
        && editedRow < ([self numberOfRows] - 1)
        )
    {
        // the tab key was hit while in the last column, 
        // so go to the left most cell in the next row
        [self selectRowIndexes:[NSIndexSet indexSetWithIndex:(editedRow+1)] byExtendingSelection:NO];
        [self editColumn: 0 row: (editedRow + 1)  withEvent: nil select: YES];
    }

}

person Kenny Wyland    schedule 24.09.2011    source источник
comment
Я не видел, чтобы вы разместили здесь измененный код. Ницца! Как я спросил ниже, есть идеи, как адаптировать это к таблице с ячейкой кнопки в крайнем правом столбце?   -  person paulmelnikow    schedule 18.10.2011
comment
Если вы хотите, чтобы табуляция пропускала этот столбец, просто измените lastColumn на count - 2. Если вы хотите, чтобы вкладка переходила к этой кнопке... Я не уверен. Я никогда раньше не имел с этим дела.   -  person Kenny Wyland    schedule 19.10.2011
comment
Вкладка уже останавливается там (это устанавливается в Системных настройках). Когда я нажимаю выход из него, я хочу перейти к следующей строке.   -  person paulmelnikow    schedule 19.10.2011
comment
Спасибо. Если я опубликую еще один вопрос, я дам ссылку на него здесь.   -  person paulmelnikow    schedule 20.10.2011


Ответы (2)


Подкласс UITableView и добавьте код для перехвата вызова textDidEndEditing.

Затем вы можете решить, что делать, основываясь на чем-то вроде этого:

- (void) textDidEndEditing: (NSNotification *) notification
{
    NSDictionary *userInfo = [notification userInfo];

    int textMovement = [[userInfo valueForKey:@"NSTextMovement"] intValue];

    if ([self selectedColumn] == ([[self tableColumns] count] - 1))
        (textMovement == NSTabTextMovement)
    {
        // the tab key was hit while in the last column, 
        // so go to the left most cell in the next row
        [yourTableView editColumn: 0 row: ([self selectedRow] + 1)  withEvent: nil select: YES];
    }

    [super textDidEndEditing: notification];
    [[self window] makeFirstResponder:self];

} // textDidEndEditing

Этот код не проверен... никаких гарантий... и т. д. И вам может понадобиться переместить этот вызов [super textDidEndEditing:] для случая табуляции в самой правой ячейке. Но, надеюсь, это поможет вам дойти до финиша. Дай мне знать!

person Michael Dautermann    schedule 15.10.2011
comment
Любая идея, как адаптировать это к табличному представлению с ячейкой кнопки в крайнем правом столбце? Нет вызова textDidEndEditing, когда он теряет фокус. - person paulmelnikow; 18.10.2011

Вы можете сделать это без создания подклассов, реализуя control:textView:doCommandBySelector:

-(BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {

    if(commandSelector == @selector(insertTab:) ) {
        // Do your thing
        return YES;
    } else {
        return NO;
    }   
}

(NSTableViewDelegate реализует протокол NSControlTextEditingDelegate, в котором определен этот метод)

Этот метод реагирует на фактическое нажатие клавиши, поэтому вы не ограничены методом textDidEndEditing, который работает только для текстовых ячеек.

person Bob Vork    schedule 08.04.2013
comment
Этот метод никогда не вызывается для делегата tableview - person Erik Aigner; 07.01.2019