了解OutlineView中不同方法的关系

时间:2011-10-09 17:13:59

标签: objective-c

在使用OutlineView时,我无法完全理解可以返回单元格的所有不同位置。据我所知,有四个地方:

NSOutlineViewDataSource有:

  • outlineView:child
  • outlineView:objectValueForDataColumn

而且NSOutlineViewDelegate有:

  • outlineView:willDisplayCell
  • outlineView:dataCellForTableColumn

如果我有一个包含不同项目的大纲视图,例如SourceList示例,我在哪里做什么以及为什么?我有GroupItem头和一个子类NSTextFieldCell的IconAndImage单元格树。这些应该在哪里实例化,我应该在哪里设置样式,图像和标题?

1 个答案:

答案 0 :(得分:1)

单词单元格中Cocoa的含义与您在Excel中称为单元格的内容不同。

在Cocoa中,单元格是NSCell子类,可以被视为轻量级可重用NSView。它用于以相同的方式绘制许多项目。 E.g。

- (void)drawRect:(NSRect)draw_rect {
    // ...
    for ( id value in myDataArray ) {
        [cell setObjectValue:value];
        NSRect cellFrame = ...;
        [cell drawWithFrame:cellFrame inView:self];
    }

因此,数据源不会返回单元格,而是返回作为[(NSCell) -(void)setObjectValue:(id)value]参数的对象。委托返回要为每个项目使用的单元格对象,并且应该实现,以便您只创建一次单元格类型。 E.g。

- (NSCell *)outlineView:(NSOutlineView *)outlineView
 dataCellForTableColumn:(NSTableColumn *)tableColumn
                   item:(id)item {
    NSCell *cell = nil;
    switch(tableColumn.tag) {
         case 0:
             if  ( ! myCell ) {
                  myCell = [[NSCell alloc] init];
             }
             cell = myCell;
             break;
        default:
             break;
    }
    return cell;
}

您应该使用表列标签或类似功能来处理用户的列重新排序。