Нажмите вкладку NSTableView, чтобы перейти от строки к строке во время редактирования - PullRequest
5 голосов
/ 24 сентября 2011

У меня есть NSTableView.Во время редактирования, если я нажимаю на вкладку, он автоматически переходит к следующему столбцу.Это фантастика, но когда я редактирую поле в последнем столбце и нажимаю вкладку, я бы хотел перейти к первому столбцу следующей строки.1004 * Спасибо Майклу за начальный код, он был очень близок к тому, что в итоге заработало!Вот последний код, который я использовал, надеюсь, он будет полезен кому-то еще:

- (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];
    }

}

Ответы [ 2 ]

2 голосов
/ 08 апреля 2013

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

1 голос
/ 15 октября 2011

Подкласс 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:] для случая с вкладкой в ​​правой части самой ячейки. Но, надеюсь, это поможет вам до финиша. Дайте мне знать!

...