NSArrayControllerを使ったNSTableViewへのデータセット

NSTableViewに値を表示するのは、原始的には以下のメソッドを利用して行う。

- (int)numberOfRowsInTableView:(NSTableView *)aTableView;
- (id)tableView:(NSTableView *)aTableView
        objectValueForTableColumn:(NSTableColumn *)aTableColumn
        row:(int)rowIndex;

でももっとスマートな方法として、NSArrayControllerというオブジェクトを利用して行えるらしいのでやってみた。

基本的にはxibファイルの編集とコーディング

・xibファイルの編集 1. 表示対象のNSTableViewを追加する 2. MainMenu.xibにNSArrayControllerを追加 3. NSArrayControllerと、データを追加するクラスを結合する(線を引っ張る) 4. NSTableViewのバインディング設定を入れる Bind to: NSArrayControllerを選択する Controller Key: arrangedObject Model Key Path: コラムごとにデータを表示し分ける場合、ここに設定したキーで選択する

・コーディング こっちはNSArrayControllerにデータを追加するコードを書くだけなのだけど、 いろいろな方法で設定できるようだ。 基本的にはModel Key Pathで設定したキーに対応するデータが取得できるようにすればよい。 ただその方法が複数ある。

  1. NSDictionaryを使う方法 NSArrayControllerに入力するArrayのデータの各項目にNSDictionaryのインスタンスを入れて、 キーで選択できるようにすればよい
- (void) setTable_noclass{
    NSMutableArray* mArr = [NSMutableArray arrayWithCapacity:0];
    int i;
    for (i=0; i < 10; i++)
    {
        NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSString stringWithFormat: @"hoge %d", i], @"hoge",
                              [NSString stringWithFormat: @"moge %d", i], @"moge",
                              nil];
        
        [mArr addObject:dict];
    }
    
    [control_noclass addObjects:mArr];
}
  1. Publicなオブジェクトにアクセスする classInstance.valueというスタイルでアクセスできればよい
- (void) setTable_public{
    NSMutableArray *tableData = [[[NSMutableArray alloc] initWithCapacity: 0] retain];
    for(int i = 0; i < 10; i++){
        
        PublicObject *obj = [[PublicObject alloc] init];
        obj.hoge = [NSString stringWithFormat: @"hoge %d", i];
        obj.moge = [NSString stringWithFormat: @"moge %d", i];        
        
        [tableData addObject: obj];
    }
    // Insert code here to initialize your application
    
    [control_public addObjects: tableData];
}
  1. Privateなオブジェクトにアクセスする getterで取得できる形にしておけばよい
- (void) setTable_private{
    NSMutableArray* tableData = [[[NSMutableArray alloc] initWithCapacity: 0] retain];
    for(int i = 0; i < 10; i++){
        
        PrivateObject *obj = [[PrivateObject alloc] init];
        [obj setData: [NSString stringWithFormat: @"hoge %d", i]
                Moge: [NSString stringWithFormat: @"moge %d", i]];
        
        [tableData addObject: obj];
    }
    // Insert code here to initialize your application
    
    [control_private addObjects: tableData];
}

PrivateObject.h

@interface PrivateObject : NSObject {
    NSString *hoge, *moge;
}

- (void) setData: (NSString*) h Moge: (NSString*) m; //setter
- (NSString *)hoge; //getter
- (NSString *)moge; //getter

@end

PrivateObject.m

#import "PrivateObject.h"

@implementation PrivateObject


- (void) setData: (NSString*) h Moge: (NSString*) m{
    hoge = [h retain];
    moge = [m retain];
}

- (NSString*)hoge{
    return hoge;
}

- (NSString*)moge{
    return moge;
}

サンプルプロジェクト

Written on April 27, 2011