outlineView: objectValueForTableColumn: byItem: not called

Я пытаюсь создать исходный список для новой программы, и у меня возникла небольшая проблема с использованием основанного на представлении NSOutlineView. Мой код отлично работает с использованием NSOutlineView на основе ячеек, поэтому я немного запутался в том, что происходит.

Вот мой код для делегата и источника данных:

#pragma mark -
#pragma mark NSOutlineView Delegate

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item {
    return (item == nil) ? YES : [(SourceListNode *)item groupItem];
}

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    if ([(SourceListNode *)item groupItem]) {
        return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
    }
    else {
        return [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
    }
}

#pragma mark -
#pragma mark NSOutlineView Data Source

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
    return (item == nil) ? [sourceListNodes count] : [(SourceListNode *)item numberOfChildren];
}

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
    return (item == nil) ? YES : ([(SourceListNode *)item numberOfChildren] > 0);
}

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
    return (item == nil) ? [sourceListNodes objectAtIndex:index] : [(SourceListNode *)item childAtIndex:index];
}

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
    return [(SourceListNode *)item name];
}

Когда я запускаю это через отладчик, он вижу, что outlineView: objectValueForTableColumn: byItem: не выполняется. В результате получается контурный вид без текста. Созданы правильные ячейки, и я могу их выбирать и расширять. Что мне не хватает?

ОБНОВЛЕНИЕ: Я удалил свой исходный список в IB, добавил новый и подключил его к моему объекту контроллера. Результаты были лучше, но в ячейках заголовка был текст «HEADER CELL», а в дочерних ячейках - «Table View Cell».

Я снова пропустил программу через отладчик, и на этот раз был выполнен outlineView: objectValueForTableColumn: byItem: . Однако он не заполнял текст ячейки.

Затем я обновил outlineView: viewForTableColumn: item: следующим образом:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    NSTableCellView *result;
    if ([(SourceListNode *)item groupItem]) {
        result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
    }
    else {
        result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
    }

    [[result textField] setStringValue:[(SourceListNode *)item name]];

    return result;
}

Теперь все работает, как ожидалось.

Короче говоря, я решил свою проблему. Однако теперь у меня есть другой вопрос. Какова цель outlineView: objectValueForTableColumn: byItem: для базовых представлений структуры? Он выполняется, но ничего не делает.

5
задан John Barnes 6 January 2012 в 21:13
поделиться