Joh*_*nes 5 cocoa objective-c nsoutlineview
我正在尝试为新程序创建一个源列表,并且我在使用基于视图的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];
}
Run Code Online (Sandbox Code Playgroud)
当我通过调试器运行它时,它看到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;
}
Run Code Online (Sandbox Code Playgroud)
现在一切都按预期工作.
总之,我已经解决了我的问题.但是,我现在有另一个问题.outlineView:objectValueForTableColumn:byItem:基于视图的大纲视图的目的是什么?它执行,但似乎没有做任何事情.
基于视图与基于单元格略有不同。
所不同的只是将“id”返回值替换为“NSView”。
改变这个:
- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
Run Code Online (Sandbox Code Playgroud)
对此:
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
Run Code Online (Sandbox Code Playgroud)
这是假设您正在运行 10.7,并且您实际上将返回一个 NSView。
| 归档时间: |
|
| 查看次数: |
4313 次 |
| 最近记录: |