2011-01-20 77 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