基于视图的 NSOutlineView 在父视图之上绘制子视图
Posted
技术标签:
【中文标题】基于视图的 NSOutlineView 在父视图之上绘制子视图【英文标题】:View Based NSOutlineView Drawing Child Views Atop Parent Views 【发布时间】:2011-08-08 18:58:32 【问题描述】:使用 NSOutlineView + NSTreeController + Core Data 会导致奇怪的大纲视图布局。如下图所示,大纲视图在“父级”展开时为“子级”创建了一个空间,而是将“子级”绘制在“父级”之上。我创建了一个按钮,按下该按钮会调用 [outlineVIew reloadData] 方法,该方法会导致视图正确绘制。
核心数据模型:
父母 孩子们 是叶子 姓名我的 xib 设置:
NSOutlineView 委托设置为文件的所有者 NSTreeController 绑定到我的文档核心数据上下文 NSTableColumn 绑定到 NSTreeController.arrangedObjects NSTextField 绑定到 NSTableCellView.objectValue.nameNSPersistentDocument 类:
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
[super windowControllerDidLoadNib:aController];
Node *parent = [self createNodeOfTypeString:@"Node"];
Node *child = [self createNodeOfTypeString:@"Node"];
parent.name = @"Parent";
parent.isLeaf = NO;
[parent addChildrenObject:child];
child.name = @"Child";
child.isLeaf = YES;
[self.treeController addObject:parent];
- (id)outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
return [item representedObject];
- (NSView *)outlineView:(NSOutlineView *)ov viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
if ([[item representedObject] isKindOfClass:[Node class]])
// Everything is setup in bindings
return [ov makeViewWithIdentifier:@"MainCell" owner:self];
return nil;
结果:
父级折叠的大纲视图
父级展开并在其上绘制子级的大纲视图
【问题讨论】:
截图中Name
来自哪里?它不会出现在模型中。
【参考方案1】:
这不是核心数据相关的问题。这是 NSTreeController 中的东西。即使数据模型返回错误的值,它们也不应该像那样相互重叠。
树控制器在某处被不正确地绑定。它应该只有一个显示“父级”的顶部节点。相反,它有一个显示“名称”的第二个顶部节点。
【讨论】:
以上是关于基于视图的 NSOutlineView 在父视图之上绘制子视图的主要内容,如果未能解决你的问题,请参考以下文章
NSTreeController/NSOutlineView 失去选择