2011-10-24 46 views
2

我有一個NSArrayController的綁定到一個NSTableView等等之類的表列如下:排序NSTableColumn與NSArrayController的

NSTableView bindings: 
Content -> ArrayController.arrangedObjects 
SelectionIndexs -> ArrayController.arrangedObjects 
SortDescriptors -> ArrayController.sortDescriptors 

NSTableColumn bindings: 
Value -> ArrayController.arrangedObjects.description 

當我嘗試並使用列標題它只是像

error setting value for key path sortDescriptors of object NSArrayController 
崩潰對其進行排序

有沒有想法?

回答

1

讓我建議你一個簡單的方法來做到這一點 -

NSTableColumn bindings: 

Value -> 

Bind to: ArrayController 

Controller Key : arrangedObjects 

Model Key Path : keyPath (such as name) 

如果您是初次使用與表視圖綁定,本文將極大地幫助你 -

編輯:項目搬遷到Github。 (沒有更多的解釋 - 只有代碼)

NSTableView, NSArrayController and More Bindings

+0

上面的答案不會排序 –

4

我用完全相同的問題今天奮鬥。

看起來,將tableView的內容和selectionIndexes綁定到數組控制器IB > inspector window > select your tableView > bindings tab,可以通過單擊表頭來禁用排序。這很有意義,因爲表格視圖現在向您顯示數組控制器的確切內容(和排序)。

我在IB中取消選中這些綁定,還刪除了表列IB > inspector window > select your NSTableColumn > attributes pane中的任何排序鍵。在表列的綁定選項卡中選中複選框Creates Sort Descriptor。在表上不需要sortDescriptor,儘管我認爲將表的sortDescriptor綁定到Shared User Defaults Controller可以在您退出應用程序時保存順序。

如果您需要對錶進行排序,請在陣列控制器上放置一個sortDescriptor,也許在awakeFromNib

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    [self setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"propertyOfYourObject" ascending:YES selector:@selector(compare:)]]]; 
} 

這不會影響點擊表格列標題。

我無法在數組控制器上獲得一個sortDescriptor來處理綁定。

+1

如果你像提到的那樣從NSTableView中刪除內容綁定,這就禁用了列上的自動排序描述符,你應該能夠得到sortDescriptor來處理綁定。 我必將我NSTableColumns編程到arraycontroller和規定,像這樣的 「創建排序描述符」 綁定選項: [列綁定:@ 「值」 toObject:self.arrayController withKeyPath:[的NSString stringWithFormat:@「arrangedObjects% @「,c.key]選項:@ {NSCreatesSortDescriptorBindingOption:@(YES)}]; – thamster

0

我在您的綁定嘗試中看到幾個問題。

  1. 通常根本不需要綁定NSTableView。將特定的NSTableColumn的值綁定到NSArrayController就足夠了。

  2. 您嘗試綁定某個對象.description屬性。請記住 - 「描述」就像Obj-C中的「保留字」。任何NSObject應該在其「描述」方法中將其自身表示爲NSString。這就是調試器中的po <object>,或者通過「%@」將一個NSObject傳遞給NSLog。所以......可能你會想把你的財產重新命名爲別的東西。

  3. 根本不需要綁定NSArrayControllerNSTableViewNSTableColumn的排序描述符。碰巧,當您將NSTableColumn的值綁定到NSArrayControllerarrangedObjects時,NSTableColumn(實際上爲NSColumnHeader)對象知道將NSArrayControllersortDescriptor設置爲與您爲該列的值綁定指定的路徑相同的路徑 - 當你點擊列標題時。換句話說 - 如果您只是將列的值綁定到NSArrayController的arrangedObjects,則通過單擊列標題進行排序是免費的。上表結合

文檔是壞的,令人沮喪。使用Table有幾種不同的方案,調試綁定問題是一個真正的噩夢。然而,網上有很多散文和教程。

希望這會有所幫助。

相關問題