NSTableView にデータを表示させる方法
iOS でアプリを作る際に一番利用していたパーツは、UITableView だったので、OSX でも同様の NSTableView の使用頻度が高いと思います。
というわけで、この記事では、NSTableView の基本的な使い方を紹介します。
新規プロジェクトの作成
XCode 起動 → 新規プロジェクト作成 → OSX → Application → Cocoa Application で、適当なファイル名を付けて、適当なところに置きます。
そして、テーブルを管理するために用いる NSObject のサブクラスを追加します(ここでは、RKTableViewController と名付けました)。
NSTableView に値を設定する最低限の実装
NSTableView に値を設定するには、NSTableView data source のメソッドをオーバーライドする必要があります。最低限、必要なのは、以下の 2 つのメソッドです。
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
iOS の UITableView と似た感じですね。ただ iOS と違って、列と行を扱う必要があります。行(row)は分かりますが、列(column)の区別はどうするのか?それには、NSTableColumn の固有名(identifier)を比較して、区別します。
この identifier は、xib ファイルから変更することが出来ます。
MainMenu.xib をぺたぺたいじる
Object Library から、“Table View” を Window の下の View の上に適当に載せます。そして、“Object” を “Objects” に加えます。“Object” の Custom Class の Class に “RKTableViewController” を登録します。
そして、“RKTableViewController” が Table View のデータを変更できるように(NSTableView data source のメソッドをオーバーライドできるように)、Outlet で接続します。左クリックから線を結べます。
そして、列(Column)の区別をするために、列に名前を付けておきます。NSTableColumn の Identifier に “TITLE” と “DESCRIPTION” と名付けます。
さて、ここからは、RKTableViewController で、NSTableView data source のメソッドをオーバーライドするだけです。
NSTableView data source のメソッドをオーバーライドする
RKTableViewController.m に以下の内容を記述しました。_dataArray に表示させるデータを用意して、それを表示させています。後は、Column の Identifier ごとに返す値を変えれば OK です。
#import "RKTableViewController.h"
@implementation RKTableViewController {
NSMutableArray *_dataArray;
}
- (id)init
{
self = [super init];
if (self) {
NSLog(@"%s", __func__);
_dataArray = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
NSDictionary *data = @{@"title": [NSString stringWithFormat:@"title-%d", i],
@"description": [NSString stringWithFormat:@"description-%d", i]};
[_dataArray addObject:data];
}
}
return self;
}
#pragma mark - NSTableView data source
- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView
{
NSLog(@"%s", __func__);
return _dataArray.count;
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSLog(@"%s", __func__);
NSDictionary *data = [_dataArray objectAtIndex:row];
if ([[tableColumn identifier] isEqualToString:@"TITLE"]) {
return [data objectForKey:@"title"];
} else {
return [data objectForKey:@"description"];
}
}
実行結果
以下のように NSTableView にデータが表示できています。やったね!