3

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

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

这只能通过继承 NSOutlineView 来实现吗?在子类中需要覆盖什么?或者有没有更简单的方法让它缩进多列?

4

1 回答 1

2

结果比我预期的要容易。这是解决方案的草图。要在 NSOutlineView 中缩进除大纲列之外的列,您可以:

  • 创建您将用于该列的 NSCell 类的子类,例如 MYIndentedCell
  • indentation为 MYIndentedCell添加一个实例变量,并为其提供访问器和修改器方法
  • 至少将 MYIndentedCell 中的 drawWithFrame:inView: 覆盖为:
     - (void) drawWithFrame: (NSRect) frame inView: (NSView*) view
     {
       NSRect newFrame = 框架;
       newFrame.origin.x += 缩进;
       newFrame.size.width -= 缩进;
       [超级drawWithFrame:newFrame inView:view];
     }
  • 如果该列是可编辑的,您还需要覆盖editWithFrame:inView并与上述类似selectWithFrame:inView:
  • 将 cellSize 覆盖为:
     - (NSSize) 细胞大小
     {
       NSSize cellSize = [超级 cellSize];
       cellSize.width += 缩进;
       返回单元格大小;
     }
  • 最后,让列中的缩进跟随 NSOutlineView 的大纲列的缩进将由大纲视图的委托处理。委托需要实现以下内容:
     - (void) outlineView: (NSOutlineView *) 视图
              willDisplayCell: (id) 单元格
              forTableColumn: (NSTableColumn *) 列
              项目:(id)项目
     {
       if (column == theColumnToBeIndented) {
         [单元格设置缩进:
                  [view indentationPerLevel] * [view levelForItem: item]];
       }
     }

如果您仍然无法使其正常工作,您可能需要查看ImageAndTextCell.mApple 的SourceView 示例代码,我发现它对弄清楚如何执行上述操作非常有帮助。

于 2010-03-16T08:53:56.203 回答