我已经在这个主题上浪费了一天的时间,但仍然不知道如何以正确的方式完成此任务。
我正在使用 NSOutlineView
来显示文件系统层次结构。对于第一列中的每一行,我需要显示复选框、关联的图标以及文件或目录的名称。由于没有标准方法来实现此目的,因此我使用 SourceView 和 PhotoSearch 示例对 NSTextFieldCell
进行子类化,将 IB 中的 value
绑定(bind)到 name
属性我的树项目类是 NSTreeController。我使用 drawWithFrame:inView:
覆盖来绘制复选框和图像,将文本绘制转发到 super
。我还使用 trackMouse:inRect:ofView:untilMouseUp:
覆盖来处理复选框交互。
一切都很好,直到我注意到一旦我在自定义单元格内按下鼠标按钮,单元格对象就会被 copyWithZone:
复制,然后这个临时对象将被发送到 trackMouse :inRect:ofView:untilMouseUp:
消息,使得无法修改 View 中原始单元格的检查状态。
由于问题主题是关于绑定(bind)的,我认为这可能是答案,但我完全不明白应该如何将所有这些困惑连接起来以按预期运行。尝试过这个:
[[[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:]:此类与键状态的键值编码不兼容的错误。”和类似的。
最佳答案
您绑定(bind)表(或大纲)列的值,而不是单个数据单元格的状态。数据单元格的对象值设置为当前行/列的值,然后进行绘制,这样您就不会无缘无故地创建数千(或数百万?)的单元格。
此外,您需要树或数组 Controller 的 arrangedObjects,而不是它的选择。
将列的值绑定(bind)到树 Controller 的arrangedObjects作为 Controller 键,并将“state”作为IB中的模型键路径;或上面代码中的@“arrangedObjects.state”。
关于objective-c - 将单个 NSCell 绑定(bind)到多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751589/