outlineView: objectValueForTableColumn: byItem: не вызывается - PullRequest
5 голосов
/ 06 января 2012

Я пытаюсь создать список источников для новой программы, и у меня возникла небольшая проблема с использованием основанного на представлении 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: для базовых видов контуров вида? Он выполняется, но, похоже, ничего не делает.

1 Ответ

4 голосов
/ 07 января 2012

Просмотр на основе немного отличается от на основе ячеек.

Все, что отличается, это замена возвращаемого значения id на NSView.

Изменить это:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item

К этому:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item

Предполагается, что вы работаете с 10.7, и на самом деле собираетесь вернуть NSView.

...