2013-08-30 15 views
9

私はいくつかのモデルをNSTableViewに挙げる簡単なアプリを持っています。ビューベースのNSTableViewに列(バインディング付き)をプログラムで追加しますか?

この表は、2列の完全な標準ビューベースの表であり、バインディングを使用してNSArrayControllerによって生成されます。そのすべてはInterface Builderで設定され、期待どおりに動作します。

ここでは、プログラムでいくつかの列を追加し、これらの新しい列をモデルのさまざまなキーパスにバインドしたいと考えています。そしてそこに、私は立ち往生している。簡単のため

、この設定を前提としています

  1. Modelオブジェクトは1つだけNSStringのプロパティでプレーンオブジェクトです:name
  2. AppDelegateがモデルの数を保持しているNSArrayのプロパティ(models)を持っていますインスタンス。
  3. NSArrayControllerのcontentは、アプリケーションデリゲートのmodels配列にバインドされています。
  4. NSTableViewのcontentは、アレイコントローラのarrangedObjectsにバインドされています。
  5. 表の最初の列はnameプロパティを表示するには、(IBに)バインドされている、すなわち列→テーブルセルビュー→静的なテキストテーブルビューセル→は、テーブルセルのビューの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 

のI /データセルに、テーブル、列、アレイコントローラ、アレイ自体、ならびにキーパスのすべての方法からの結合のように多くの組み合わせを試みたが、何も動作しません。新しい列はちゃんと追加されますが、一度も入力されません。

私が作成する基本的な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]; 

ご注意: - あなたの可変配列が唯一のそれはあなたがこれを使用して、列のNSTableCellViewのサブビューにバインドする必要があるデータ

+0

申し訳ありませんが、動作しません。それを試してみました。列をバインドするのは、セルベースのテーブルに対してのみ機能します。ビューベースのテーブルではありません。 – Flambino

2

に移入されます、その後arraycontrollerに結合する必要がありますデリゲートメソッド:

- (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; 
} 
関連する問題