【问题标题】:outlineView:objectValueForTableColumn:byItem: not called大纲视图:objectValueForTableColumn:byItem:未调用
【发布时间】:2012-01-06 19:34:07
【问题描述】:

我正在尝试为新程序创建源列表,但在使用基于视图的 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”,子单元格有“表格视图单元格”。

我再次通过调试器运行程序,这次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: 用于基于视图的大纲视图的目的是什么?它执行,但似乎没有做任何事情。

【问题讨论】:

  • 嗨,约翰,您是否明白为什么基于视图的大纲视图需要 objectValueForTableColumn ?我自己也在想同样的事情。

标签: objective-c cocoa nsoutlineview


【解决方案1】:

基于视图与基于单元格略有不同。

唯一不同的是将“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。

【讨论】:

  • 我将id 更改为NSView *。它并没有改变我的更新结果(原帖)。
  • 不要返回 NSTableCellView。返回一个 NSView。您返回的 NSView 不必具有初始化的框架; NSControl 为您控制。填充一个新的 NSView,向其中添加元素——然后返回它。
  • 我不得不尝试一下,但我不确定在这种情况下我为什么要这样做。 IB 中的默认源列表配置了两个 NSTableCellView(HeaderCell 和 DataCell)。一旦我有了一个,我只需要添加[[result textField] setStringValue:[(SourceListNode *)item name]]; 就可以了。我没有考虑什么?
  • 很抱歉,我帮不上什么忙。我不知道。
  • 你是个天才!谢谢。我忘了默认情况下,界面生成器会创建基于视图的大纲视图!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2022-11-02
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多