2013-08-30 76 views
9

我有一個簡單的應用程序,列出NSTableView中的一些模型。以編程方式將列(帶綁定)添加到基於視圖的NSTableView?

該表格是一個完全標準的基於視圖的表格,有幾列,並通過NSArrayController使用綁定進行填充。所有這一切都是在Interface Builder中設置的,並且與預期一致。

現在,我想以編程方式添加更多列,並將這些新列綁定到模型中的各種關鍵路徑。在那裏,我卡住了。

爲了簡單起見,假設這種設置:

  1. 模型對象是隻是一個單一的NSString屬性平原對象:name
  2. 的AppDelegate中具有一個NSArray屬性(models),其保持有多個模型的實例。
  3. NSArrayController的content綁定到應用程序代理的models數組。
  4. NSTableView的content綁定到陣列控制器的arrangedObjects
  5. 該表的第一列被綁定(在IB)顯示name屬性,即列→表格單元視圖→靜態文本表視圖細胞→被綁定到表格單元視圖的objectValue.name

就我所知,這是一本簡單直接的書,它的作用就如同一種魅力。

但是...我該如何添加更多列呢?

以編程方式添加一列(保持它的簡單,讓我們只說這個新列應該只顯示name財產,就這樣已經存在的列),我想我會做這樣的事情在應用程序委託:

NSTableColumn* newColumn = [[NSTableColumn alloc] initWithIdentifier:@"newColumn"]; 

// do binding magic somehow 
// [[newColumn dataCell] bind:NSValueBinding toObject:??? withKeyPath:??? options:nil]; 

[self.table addColumn:newColumn]; // the table's connected with an IBOutlet 

我嘗試的從/向數據單元,表,列,陣列控制器,陣列本身,以及keypaths的所有方式結合這麼多的組合,但沒有用。新列添加得很好,但從未填充過。

我想象我創建的基本NSTableColumn實例是基於單元格的,而不是基於視圖的,這就造成了麻煩。但是,我不知道如何從這裏開始,文檔從不談論綁定已經以編程方式添加的列。

在這種情況下,我想要的只是一個簡單的文本列,綁定到模型,就像我可以輕鬆設置IB的那個一樣。

我可以通過執行NSTableViewDataSource和「手動」提供表格來完成所有操作,但是我已經使用綁定設置了所有其他設置。

任何幫助將不勝感激。

回答

4

嘗試這樣的: -

NSString *akey = @"keyValue"; 
NSString *keypath = [NSString stringWithFormat:@"arrangedObjects.%@",akey]; 
NSTableColumn *tableColumn=[[NSTableColumn alloc]initWithIdentifier:@"newColumn"]; 

[tableView addTableColumn:tableColumn]; 
[tableColumn bind:NSValueBinding toObject:yourArrayController withKeyPath:keypath options:nil]; 
NSMutableDictionary *dc=[NSMutableDictionary dictionary]; 
[dc setObject:@"textValue" forKey:@"keyValue"]; 
[yourmutableArray addObject:dc]; 
[self setYourmutableArray:yourmutableArray]; 

請注意: - 你的可變數組應綁定到arraycontroller那麼只有將填充數據

+0

對不起,不起作用;試過了。綁定列僅適用於基於單元格的表格。不是基於視圖的表格。 – Flambino

2

您需要綁定列的NSTableCellView使用此子視圖委託方法:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    // Get cell view - NSTableCellView 
    // This can be a prototype loaded from the table view or from another nib 
    // see : - registerNib:forIdentifier: 
    NSView *cellView = [tableView makeViewWithIdentifier:@"Cell1" owner:[tableView delegate]]; 

    // - subViewWithIdentifier is a simple category method that searches -subviews 
    NSView *subView = [cellView subViewWithIdentifier:@"TextField1"]; 
    [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.name" options: nil]; 

    subView = [cellView subViewWithIdentifier:@"TextField2"]; 
    [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.address" options: nil]; 

    return cellView; 
} 

的NSView類別方法:

- (NSView *)subViewWithIdentifier:(NSString *)theIdentifier 
{ 
    __block NSView *subView = nil; 
    [[self subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
#pragma unused(idx) 
     if ([[obj identifier] isEqualToString:theIdentifier]) { 
      subView = obj; 
      *stop = YES; 
     } 
    }]; 
    return subView; 
} 
相關問題