2011-01-20 81 views
2

我已经在这个主题上杀了一天,但仍然不知道如何以正确的方式完成此操作。将单个NSCell绑定到多个值

我正在使用NSOutlineView来显示文件系统层次结构。对于第一列中的每一行,我需要显示复选框,关联图标和文件或目录的名称。由于没有标准的方法来做到这一点,我已经使用SourceView和PhotoSearch示例分类NSTextFieldCell,绑定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 11年1月21日:我也试过这样:

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

但一直得到类似的错误“[< _NSControllerTreeProxy为0x ...> valueForUndefinedKey:]:此类不是关键状态的密钥值编码。“和类似的。

回答

1

好吧,我已经成功地做什么,我需要通过绑定列的value到的self(在IB)arrangedObject和压倒一切细胞的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:。这另一种方法class'es看起来是这样的:

- (IBAction) itemChecked:(id)sender 
{ 
    MyNodeClass* node = [[sender itemAtRow:[sender clickedRow]] representedObject]; 
    if (node) 
    { 
     [node setState:[node state] == NSOnState ? NSOffState : NSOnState]; 
    } 
} 
2

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

此外,你想树或数组控制器的arrangeObjects,而不是它的选择。

绑定列的值树控制器的arrangedObjects作为控制器的关键,而“国家”作为IB模型关键路径;或者像上面的代码中的@“arrangeObjects.state”。

+0

是啊,这就是我的意思讲`value`-`name`首先结合:我已经有`arrangedObjects.name`结合`value`所以我不能将它同时绑定到`arrangedObjects.state`(并且在我可以使用的列中没有`state`绑定)。那可能怎么样? – 2011-01-21 05:46:10