OS X

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 ファイルから変更することが出来ます。

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 にデータが表示できています。やったね!

参考:NSTableViewDataSource Protocol Reference