题
我已经在这个问题上杀死了一天,但仍然不知道如何以正确的方式完成这一问题。
我在用着 NSOutlineView
显示文件系统层次结构。对于第一列中的每一行,我需要显示复选框,关联的图标和文件或目录的名称。由于没有标准的方法,我已经群 NSTextFieldCell
使用SourceView和Photosearch示例,绑定 value
在IB中 name
虽然我的树商课的属性 NSTreeController
. 。我在用着 drawWithFrame:inView:
覆盖绘制复选框和图像,将文本绘图转发到 super
. 。我也在使用 trackMouse:inRect:ofView:untilMouseUp:
覆盖以处理复选框交互。
一切都很好,直到我注意到一旦我按下自定义单元格内的鼠标按钮,就会复制单元对象 copyWithZone:
然后将此临时对象发送 trackMouse:inRect:ofView:untilMouseUp:
消息,使得无法修改视图中位于视图中的原始单元格的状态。
由于问题主题是关于绑定的,所以我认为这可能是答案,但是我完全不明白我应该如何将所有这些混乱联系起来,以按预期运行。尝试了:
[[[treeView outlineTableColumn] dataCell] bind:@"state"
toObject:treeController
withKeyPath:@"selection.state"
options:nil];
但根本没有成功。好像我没有得到它。
这可能是我采取的完全错误的方式吗?您能提出更好的替代方案或任何链接以进行进一步阅读吗?
UPD 1/21/11: :我也曾尝试过:
[[[treeView outlineTableColumn] dataCell] bind:@"state"
toObject:treeController
withKeyPath:@"arrangedObjects.state"
options:nil];
但是不断遇到诸如“ [<_nscontrollerTreeproxy 0x ...> valueforundefinedkey:]:此类不是密钥状态符合密钥值编码的错误。和类似。
解决方案 2
好吧,我设法通过绑定列的来完成我需要的事情 value
至 arrangedObject
' self
(在IB中)和覆盖的单元格 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
更改是在另一个类中执行的,将其方法连接到单元的 selector
(在IB中)我称之为
[NSApp sendAction:[self action] to:[self target] from:[self controlView]];
来自牢房 trackMouse:inRect:ofView:untilMouseUp:
. 。这是另一种类的方法,如下所示:
- (IBAction) itemChecked:(id)sender
{
MyNodeClass* node = [[sender itemAtRow:[sender clickedRow]] representedObject];
if (node)
{
[node setState:[node state] == NSOnState ? NSOffState : NSOnState];
}
}
其他提示
您可以绑定表(或大纲)列的值,而不是单个数据单元格的状态。数据单元的对象值设置为当前行/col的值然后绘制,因此您没有出于没有充分理由创建的数千个(或数百万?)的单元格。
此外,您想要树或数组控制器的 布置对象, ,不是它的选择。
绑定 列 对树控制器的价值 布置对象 作为控制器键,“状态”作为IB中的模型密钥路径;或上述代码中的 @ @“ bendeDobjects.state”。