7

我想知道如何实现一个大纲视图,就像 Xcode 3 用于构建配置的那样:

替代文字

当使用带有绑定的 NSOutlineView/NSTableView 和 NSTreeController/NSArrayController 时,由于显而易见的原因,视图的列将绑定分配给,而不是单个单元格。如果一列中的每一行都使用相同的单元格,那么它就是小菜一碟。但是,如果每一行(可能)使用自己的单元格类型(并且可能使用它自己的绑定集合),那么事情就会变得很奇怪。

查看屏幕截图可以清楚地看到文本字段单元格只需要一个“值”绑定。而弹出按钮单元格至少需要一个用于“ content ”,一个用于“ contentValues ”,最后但并非至少一个绑定用于“ selectedIndex / selectedObject / selectedValue ”。复选框单元格需要一个“”绑定和(可能)一个“标题”绑定。

如何使用尽可能干净(和少)的代码来实现这一点?
或者有人可能会问: Apple 是如何做到的?)

到目前为止,这是我自己尝试过的:我通过[outlineView:dataCellForTableColumn:item:]
提供适当的(复制的)单元格,并将它们绑定到各个数据模型(来自 [item代表对象])。我知道大纲视图中显示的确切数据量(< 500 行),所以每行有一个单元格不应该是太多的内存问题,不是吗?我通过绑定(耶!)获得了正确显示的数据,但是我无法更改它们的任何值。O_o 显然,值的变化永远不会通过数据模型。除了简单的[checkboxCell bind:@"value" toObject:rowModel withKeyPath:@"value" options:nil]之外,还有更多的功能吗?(因为这似乎足以值,但不适用于相应地设置它们。)

我找不到有关此主题的任何信息。每列使用自定义单元格的大量信息和提示,但没有以“每行”为基础使用它们。:(
这将为 Cocoa 教程提供一些很棒的东西,不是吗?;)

4

1 回答 1

3

不复制列的数据单元格。单元格配置为每行中的列的正确值并在其正确位置绘制。一个很好的挂钩位置是 NSTableColumn 方法-dataCellForRow:。在自定义子类中,您可以覆盖此方法并传递其 -dataCell 以进行正常操作或某些替代单元格类型。

我有机会在仅针对子项(非根项)出现的大纲视图中设置一个表示“包含”的复选框列。不能排除根项,只能排除它们的子项,因此只显示非根项的复选框是有意义的。

我创建了一个自定义 NSTableColumn 子类,它接受一个委托(我的数据源控制器)并检查它是否响应选择器 -deadCellColumn:shouldShowDeadCellForRow:。如果是这样,我调用该方法(在我的数据源控制器上实现)询问它是否应该显示一个“死单元”(一个基本的 NSCell 子类,它什么都不画)并根据答案交换它。如果委托未响应选择器,则表列返回其正常的 -dataCell。

这里需要自定义单元格(我称之为“DeadCell”),因为我想确保没有任何内容被绘制并且没有任何内容是可编辑的。我不确定这是绝对必要的,但我还是这样做了。这在您的情况下没有多大用处,但为了完整起见,我还是想说明它。

您的情况有点复杂,特别是因为涉及到绑定(并且不同的数据单元类型可以对其值有不同的绑定 - 弹出窗口可能特别具有挑战性)。就我而言,我避开了经过验证的数据源机制的绑定。它大大简化了事情。:-) 对于您的情况,使用数据源方法交换单元格类型很容易。

于 2010-08-01T19:16:38.873 回答