使用 NSOutlineView + NSTreeController + Core Data 会导致奇怪的大纲视图布局。正如您在下图中所见,大纲视图在展开“父级”时为“子级”创建了一个空间,而是将“子级”绘制在“父级”之上。我创建了一个按钮,按下该按钮会调用 [outlineVIew reloadData] 方法,该方法会导致视图正确绘制。
核心数据模型:
- 父母
- 孩子们
- 是叶
- 姓名
我的xib设置:
- NSOutlineView 委托设置为文件的所有者
- NSTreeController 绑定到我的文档核心数据上下文
- NSTableColumn 绑定到 NSTreeController.arrangedObjects
- NSTextField 绑定到 NSTableCellView.objectValue.name
NSPersistentDocument 类:
- (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;
}
结果:
折叠父级的大纲视图
父级展开和子级绘制在上面的大纲视图