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

我在用着 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

好吧,我设法通过绑定列的来完成我需要的事情 valuearrangedObject' 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”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top