【发布时间】: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