我想知道如何实现像Xcode 3用于构建配置的大纲视图:
alt text http://img812.imageshack.us/img812/9467/xcodeoutlineview.png
当使用带有绑定的NSOutlineView / NSTableView和NSTreeController / NSArrayController时,视图的列会获得分配给的绑定,而不是单个单元格,原因显而易见。 如果列中的每一行都使用相同的单元格,那么它就是小菜一碟。但是,如果每一行(可能)使用自己的单元格类型(并且可能是它自己的绑定集合),那么事情会变得很时髦。
查看截图,可以清楚地看到文本域单元只需要一个“值”绑定。虽然弹出式按钮单元格至少需要一个“内容”,一个用于“ contentValues ”,而最后但并非至少一个用于“ selectedIndex 的绑定” / selectedObject / selectedValue “。复选框单元格需要绑定“值”,并且(可能)绑定“ title ”。
如何用尽可能干净(和少量)的代码来实现这一目标? (或者有人可能会问: Apple将如何做到这一点?)
...
这是我到目前为止所尝试的内容:
我通过 [outlineView:dataCellForTableColumn:item:] 提供适当的(复制的)单元格,并将它们绑定到各个数据模型(来自[item representObject])。
我知道在大纲视图中显示的确切数据量(<500行),因此每行一个单元格不应该是内存问题太多,不是吗?
我通过绑定获得数据以正确显示(是的!)但是我无法更改任何值。 O_O
显然,价值变化根本无法通过数据模型。是否还有一个简单的 [checkboxCell bind:@“value”toObject:rowModel withKeyPath:@“value”options:nil] ? (因为获取值似乎足够,但设置则相应。
我找不到有关此主题的任何信息。每列使用自定义单元格的大量信息和提示,但没有在“每行”基础上使用它们的信息和提示。 :(
这会为Cocoa教程做一些很棒的事情,不是吗? ;)
答案 0 :(得分:3)
不会复制列的数据单元格。单元格配置为每行中列的正确值,并在适当的位置绘制。挂钩的好地方是NSTableColumn方法-dataCellForRow:。在自定义子类中,您可以覆盖此方法并将其-dataCell传递给正常操作或某些备用单元格类型。
我有机会在大纲视图中有一个复选框列表示“包含”,该列仅出现在儿童(非根项目)中。无法排除根项目,只能排除其子项,因此只显示非根项目的复选框才有意义。
我创建了一个自定义的NSTableColumn子类,它接受了一个委托(我的数据源控制器)并检查它是否响应了选择器-deadCellColumn:shouldShowDeadCellForRow:。如果是的话,我调用了那个方法(在我的数据源控制器上实现)来询问它是否应该显示一个“死细胞”(一个基本的NSCell子类,什么都不画)并根据答案交换它。如果委托没有响应选择器,则表列返回其正常的-dataCell。
这里需要自定义单元格(我称之为“DeadCell”),因为我想确保没有绘制任何内容,也没有任何内容可编辑。我不确定这是绝对必要的,但无论如何我都是这样做的。这在你的情况下并没有多大用处,但我还是想说明它的完整性。
您的情况有点复杂,特别是因为涉及绑定(并且不同的数据单元类型可能对其值具有不同的绑定 - 弹出窗口可能特别具有挑战性)。就我而言,我避开了经过验证的数据源机制的绑定。它极大地简化了事情。 :-)对于你的情况,使用数据源方法交换单元格类型很容易。