我已经在这个问题上杀了一天,但仍然不知道如何以正确的方式完成这项工作。
我正在使用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:]:此类不是密钥值编码兼容的密钥状态。”和类似的。
答案 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: