基于父视图的基于视图的NSOutlineView绘图子视图

时间:2011-08-08 18:58:33

标签: cocoa core-data nsoutlineview nstreecontroller

使用NSOutlineView + NSTreeController +核心数据导致奇怪的轮廓视图布局。正如您在下面的图像中看到的那样,大纲视图在“父级”展开时为“孩子”创建了一个空间,而是在“父级”之上绘制了“孩子”。我创建了一个按钮,按下时调用[outlineVIew reloadData]方法,使视图正确绘制。

核心数据模型:

  • 儿童
  • isLeaf
  • 名称

我的xib设置:

  • NSOutlineView委托设置为文件所有者
  • NSTreeController绑定到我的文档Core Data context
  • 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;
}

结果:

父级折叠的大纲视图

Outline View With Parent Collapsed

使用父级扩展和子级绘制的大纲视图

Outline View With Parent Expanded and Child Drawn Atop

1 个答案:

答案 0 :(得分:0)

这不是与核心数据相关的问题。它是NSTreeController中的东西。即使数据模型返回错误的值,也不应该像这样相互绘制。

树控制器在某处不正确绑定。它应该只有一个顶级节点显示“父”。相反,它有第二个顶部节点显示“名称”。