2010-05-19 30 views
0

我有一個NSTableView通過NSArrayController綁定到NSMutableArray。數組中有什麼是派生類;表的前幾列綁定到基類上存在的屬性。這一切都很好。NSTableView中的條件列值?

我遇到問題的位置是一列,只有在行映射到一個特定的子類時才應填充該列。該列僅用於顯示的屬性存在於該子類中,因爲它在基類方面沒有意義。用戶將從前兩列了解爲什麼第三列的單元格可以填充/可編輯。

第三列值的綁定位於arrangeObjects上,模型路徑類似於「foo.name」,其中foo是子類的屬性。但是,這不起作用,因爲層次結構中的其他子類不符合foo的鍵值。

看起來我唯一的選擇是讓foo成爲基類的一個屬性,所以每個人都會對它作出響應,但是這會混淆模型對象的接口。

有沒有人想出了這種情況的乾淨設計?這並不罕見(我是Cocoa的新手,我只是學習綁定的入口和出口)。

回答

1

解決此問題的一種方法是僅對前兩列使用綁定作品。對於其餘的列,您實現了一個實現所需定製邏輯的NSTableViewDataSource。

首先創建一個實現

-tableView:objectValueForTableColumn:row: 
-tableView:setObjectValue:forTableColumn:row: 

一個新的類(你只需要在第2,如果假設用戶編輯其他列)。然後添加一個

IBOutlet NSArrayController *valuesController; 

該類的實例變量。

Inside Interface Builder添加該類的新對象(從庫中將藍色的「對象」多維數據集拖入文件的窗口中)。將陣列控制器連接到新的數據源。然後將數據源與表視圖連接起來,使其成爲表視圖的數據源。

確保過去前兩列的列不受任何約束。

-tableView:objectValueForTableColumn:row: 

方法需要將調用這些列,你可以看看對象需要:

- (id)tableView:(NSTableView *)aTableView 
    objectValueForTableColumn:(NSTableColumn *)aTableColumn 
         row:(NSInteger)rowIndex; 
{ 
    NSObject *myObject = [[valuesController arrangedObjects] objectAtIndex:rowIndex]; 
    id columnIdentifier = [aTableColumn identifier]; 
    if ([columnIdentifier isEqual:@"foo"]) { 
     if ([myObject respondsToSelector:@selector(fooValue)]) { 
      return [myObject fooValue]; 
     } 
    } 
    return nil; 
} 

注意如何我使用的列標識符,看看哪些列正在被請求。在Interface Builder中設置列標識符。