每行使用不同的单元格(和数据类型)实现NSOutlineView/NSTableView

Reg*_*ent 7 cocoa nsoutlineview nstableview custom-cell cocoa-bindings

我想知道如何实现像Xcode 3用于构建配置的大纲视图:

替代文字http://img812.imageshack.us/img812/9467/xcodeoutlineview.png

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

查看屏幕截图,可以清楚地看到文本域单元格只需要一个"值"绑定.虽然弹出按钮单元需要至少一个用于" 内容 ",一个用于" contentValues ",而最后但不是至少一个用于" selectedIndex/selectedObject/selectedValue ".复选框单元格需要绑定" value "和(可能)一个用于" title ".

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

...

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

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

Jos*_*zzi 3

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

我有一次在大纲视图中有一个表示“包含”的复选框列,该复选框仅针对子项(非根项目)出现。无法排除根项,只能排除它们的子项,因此仅显示非根项的复选框才有意义。

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

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

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