jazzbird
@jazzbird

Как работает редактирование в view based NSTableView?

Кто может помочь объяснить, как работает редактирование в view based NSTableView? Я пытаюсь реализовать поведение, при котором при двойном клике подменяется вьюшка и показывается более подробное редактирование данных ячейки.

Перерыл весь StackOverflow, прочитал гору эпловой документации, вызывать редактирование по даблклику… даже научился подменять вьюшку, но не могу редактировать остальные поля в ячейке, редактирование сразу закрывается. Как я понимаю, там надо разобраться с механизмом передачи фокуса от ячейки к textField через firstResponder.

На всякий случай: в приложении я использую Core Data и Cocoa Bindings.

Если есть кто-то, кто реально рубит в этой теме, то я даже готов ему за консультацию денег заплатить, благо это не последний сложный для меня вопрос, в котором хочется основательно разобраться.
  • Вопрос задан
  • 2930 просмотров
Пригласить эксперта
Ответы на вопрос 2
jazzbird
@jazzbird Автор вопроса
OSX, да.

При даблклике меняется значение @property editingRow, перезагружается таблица, подменяется вьюха и начинается редактирование. Приходится использовать и делегирование, и cocoa bindings одновременно. Лучше способа пока не нашёл.

Текущее решение работает, но только если у тебя один textField в ячейке. Остальные редактировать не получается, при любом клике режим редактирования выключается.

Мне нужно не править текущее решение, а понять как это в принципе должно делаться.

В эпловых доках нашёл два абзаца на эту тему:
Views or controls in a table sometimes need to respond to incoming events. To determine whether a particular subview should receive the current mouse event, a table view calls validateProposedFirstResponder:forEvent: in its implementation of hitTest. If you create a table view subclass, you can override validateProposedFirstResponder:forEvent: to specify which views can become the first responder. In this way, you receive mouse events.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
        // getting tableview's arraycontroller
        NSArrayController *arrayController = [[tableView infoForBinding:NSContentBinding] valueForKey:NSObservedObjectKey];
        
        // checking if task was done and assigning custom cellview
        NSNumber *done = [arrayController.arrangedObjects[row] valueForKey:@"done"];
        if ([done boolValue]) {
                return [tableView makeViewWithIdentifier:@"done" owner:self];
        } else if (self.editingRow == row) {
                return [tableView makeViewWithIdentifier:@"editing" owner:self];
        } else {
                return [tableView makeViewWithIdentifier:@"regular" owner:self];
        }
}

- (void)doubleClick:(id)sender
{
        NSInteger clickedRow = [sender clickedRow];
        if (clickedRow != -1) {
                self.editingRow = clickedRow;
                [self.somedayTableView reloadData];
                [sender editColumn:0 row:[sender clickedRow] withEvent:nil select:YES];
        }
}
Ответ написан
Комментировать
@gressmc
туточки реализация возможно помогла бы если бы полгода ответ написан был. может поможет кому еще. macbug.ru/macosxsample/canimnstableview
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы