2010-08-01 116 views
7

我想知道一个如何实施,如一个的Xcode 3的概略图不同的细胞(和数据类型)NSTableView的是使用用于生成配置:实施NSOutlineView /每

alt text http://img812.imageshack.us/img812/9467/xcodeoutlineview.png

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

查看屏幕截图可以清楚地看到,textfield单元格只需要一个“值”的绑定。而弹出按钮单元至少需要一个“内容”,一为“contentValues”和最后但并非最不重要一个“的selectedIndex/selectedObject/了selectedValue”结合。并且复选框单元需要“”和(可能)一个用于“标题”的绑定。

如何以尽可能干净的(尽可能少的)代码实现这一点?
或者像有人可能会问:如何将苹果已经做到了?)

...

这里就是我试过自己至今:
我提供适当的(复制)细胞通过[outlineView:dataCellForTableColumn:item:]并将它们绑定到各个数据模型(来自[itemrepresentObject])。 我知道在大纲视图中显示的数据的确切数量(< 500行),因此每行有一个单元不应该是太多的内存问题,不是? 我得到数据通过绑定(yay!)正确显示但我无法更改它们的任何值。 O_o 显然,值更改根本不会传递给数据模型。有没有比简单的[checkboxCell bind:@“value”toObject:rowModel withKeyPath:@“value”options:nil]? (因为这似乎足够越来越值,而不是设置他们相应。)

我找不到关于这个主题的信息。很多关于每列使用自定义单元格的信息和提示,但没有在“每行”基础上使用它们的信息和提示。 :(
这将使一些可可教程的伟大的东西,不是吗?;)

+0

还有NSDictionaryController。不知道它会让你走多远,但看一看。 – 2010-08-01 21:05:12

+0

@Mike它不是控制器的问题,而是处理其单元格的表视图之一。但是,无论如何感谢:) – Regexident 2010-08-02 00:25:31

+0

差不多5年后,这是我能找到的关于在具有不同单元格的表格上将数据源绑定到数据源的唯一信息,“这对于Cocoa教程来说会是一些不错的东西,不是吗?” ,是的! – rraallvv 2015-03-12 04:05:42

回答

3

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

我有一个机会,在只显示儿童(非根项目)的大纲视图中有一个代表“包含”的复选框列。根项目不能排除,只有他们的子项,所以只显示非根项目的复选框是有意义的。

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

这里需要自定义单元格(我称之为“DeadCell”),因为我想确保没有绘制任何东西,也没有任何可编辑的东西。我不确定这是绝对必要的,但我仍然这样做。这在你的案例中并没有多大用处,但我想要说明它的完整性。

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

+0

噢,我的...我想我会'_just'_必须统一我的数据输入然后(使用ComboBoxCells方便地访问模板值),并使用NSFormatters确保每个项目的值类型的正确输入。不是很漂亮,但是需要这种表格视图的功能不够大/不够重要,无法投入如此巨大的后端代码,并且可能会引发混乱。 虽然这种东西是如此糟糕的工作,但主要是好消息。 – Regexident 2010-08-02 00:23:08

+0

根本没有hackery参与。这都是控制/单元机制的有效使用。另外,Cocoa Bindings更多的是面向事物的“快速应用程序开发”方面,这只消除了更广义情况下的代码。如果你想做特别的事情,你必须使用代码。在很多情况下,您可以混合使用两种(绑定和数据源)。在这种情况下,如果您的单元格类型都共享相同的绑定,则只需要您的自定义列,其他所有内容都应该“正常工作”。 – 2010-08-02 00:54:21

+0

是的,但他们做**没有**共享相同的绑定:( 无论如何,该功能将成为一个书呆子,与潜在的用户群非常有限,所以根本不值得这么多的努力,同时延缓产品发布。 (“伟大的开发者出货”,对吧?;) 但是,感谢您的解决方案,我确信我会有一些使用它不是太遥远 – Regexident 2010-08-02 19:27:56