如何使NSOutlineView缩进多列?

时间:2010-03-10 19:37:05

标签: cocoa nsoutlineview

使NSOutlineView缩进多列的最简单或推荐方法是什么?默认情况下,它仅缩进大纲列;据我所知,没有内置支持使其缩进其他列。

我有一个NSOutlineView,它显示了两组分层数据之间的比较。对于视觉吸引力,如果大纲列中的某些项目是缩进的,我想用相同的缩进量缩进另一列中同一行上的项目。 (还有第三列显示比较两个项目的结果,此列不应缩进。)

这只能通过继承NSOutlineView来实现吗?什么需要在子类中重写?或者是否有更容易的方法来缩进多列?

1 个答案:

答案 0 :(得分:2)

事实证明比我预期的要容易。这是解决方案的草图。要缩进NSOutlineView中除大纲列以外的列,您可以:

  • 创建将用于该列的NSCell类的子类,比如MYIndentedCell
  • 向MYIndentedCell添加实例变量indentation,并为其提供访问器和mutator方法
  • 至少覆盖drawWithFrame:inView:在MYIndentedCell中:
     - (void) drawWithFrame: (NSRect) frame inView: (NSView*) view
     {
       NSRect newFrame = frame;
       newFrame.origin.x += indentation;
       newFrame.size.width -= indentation;
       [super drawWithFrame: newFrame inView: view];
     }
  • 如果列可编辑,您还需要覆盖editWithFrame:inViewselectWithFrame:inView:,类似于上述内容
  • 将cellSize覆盖为:
     - (NSSize) cellSize
     {
       NSSize cellSize = [super cellSize];
       cellSize.width += indentation;
       return cellSize;
     }
  • 最后,在列中缩进以跟随NSOutlineView的大纲列的缩进将由大纲视图的委托处理。代表需要实现以下内容:
     - (void) outlineView: (NSOutlineView *) view
              willDisplayCell: (id) cell
              forTableColumn: (NSTableColumn *) column
              item: (id) item
     {
       if (column == theColumnToBeIndented) {
         [cell setIndentation:
                  [view indentationPerLevel] * [view levelForItem: item]];
       }
     }

如果您仍然无法使其工作,您可能需要查看Apple SourceView sample code中的ImageAndTextCell.m,我发现这对于确定如何执行上述操作非常有帮助。< / p>