Ответы пользователя по тегу Cocoa
  • Как работает редактирование в view based NSTableView?

    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];
            }
    }
    Ответ написан
    Комментировать