将单个NSCell绑定到多个值

时间:2011-01-20 19:28:09

标签: objective-c cocoa nscell

我已经在这个问题上杀了一天,但仍然不知道如何以正确的方式完成这项工作。

我正在使用NSOutlineView来显示文件系统层次结构。对于第一列中的每一行,我需要显示复选框,相关图标和文件或目录的名称。由于没有标准的方法来实现这一点,我使用SourceView和PhotoSearch示例将NSTextFieldCell子类化,将IB中的value绑定到我的树项类的name属性,尽管{{1} }。我正在使用NSTreeController覆盖来绘制复选框和图像,将文本绘图转发到drawWithFrame:inView:。我也使用super覆盖来处理复选框交互。

一切都很好,直到我注意到在我的自定义单元格中按下鼠标按钮后,正在使用trackMouse:inRect:ofView:untilMouseUp:复制单元格对象,然后向此临时对象发送copyWithZone:消息,无法修改驻留在视图中的原始单元格的检查状态。

由于问题主题是关于绑定,我认为这可能是答案,但我完全不知道如何连接所有这些混乱按预期运行。试过这个:

trackMouse:inRect:ofView:untilMouseUp:

但根本没有成功。好像我没有得到它。

这可能是我采取的一种完全错误的方式吗?你能建议一个更好的替代方案或任何进一步阅读的链接吗?


UPD 1/21/11 :我也试过这个:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"selection.state"
                                       options:nil];

但仍然遇到错误,例如“[< _NSControllerTreeProxy 0x ...> valueForUndefinedKey:]:此类不是密钥值编码兼容的密钥状态。”和类似的。

2 个答案:

答案 0 :(得分:2)

绑定表(或大纲)列的值,而不是单个数据单元的状态。数据单元格的对象值设置为当前行/列的值,然后绘制,因此您没有可能创建数千(或数百万?)个单元格。

此外,您需要树或数组控制器的 arrangeObjects ,而不是它的选择。

列的值绑定到树控制器的 arrangeObjects 作为控制器密钥,并将“state”作为IB中的模型密钥路径;或者在上面的代码中使用@“arrangeObjects.state”。

答案 1 :(得分:1)

好的,我已经设法通过将列value绑定到arrangedObject的{​​{1}}(在IB中)并覆盖单元格的self来实现我所需的功能看起来像:

setObjectValue:

实际- (void) setObjectValue:(id)value { if ([value isMemberOfClass:[MyNodeClass class]]) { [super setObjectValue:[value name]]; [self setIcon:[value icon]]; [self setState:[value state]]; } else { if (!value) { [self setIcon:nil]; [self setState:NSOffState]; } [super setObjectValue:value]; } } 更改在另一个类中执行,将其方法连接到我调用的单元格state(在IB中)

selector
来自单元格[NSApp sendAction:[self action] to:[self target] from:[self controlView]];

。另一个class'es方法如下所示:

trackMouse:inRect:ofView:untilMouseUp: