ホーム > 開発 > NSTableViewを参照オブジェクトのフィールドでソートする

NSTableViewを参照オブジェクトのフィールドでソートする

NSTableViewをカラムヘッダクリックによってソートする場合、デリゲートでtableView:sortDescriptorsDidChange:を受けて、データソースをソートします。
この時NSSortDescriptorの配列が渡ってくるのですが、ここにはソートに使うカラム名と順序が入っています。
オブジェクトが一つでないのは、いくつかのカラムをクリックした場合にそのソート履歴を残しておいて、比較結果が同一の場合の第二比較条件に使うためです。
例えば名前カラムの次に年齢カラムをクリックした場合、まず年齢でソートが行われますが、同一年齢の要素はさらに名前でソートされます。

NSTableViewがNSSortDescriptorを生成する時に使うカラム名は、NSTableColumnにsetSortDescriptorPrototype:で設定しておきます。
通常データソースはNSMutableArrayに詰め込まれたオブジェクトの配列で、NSSortDescriptorが指定するカラム名をキーバリューコーディングで解決してソートを行います。

ここで、次のようなケースを考えます。
テーブルに住所録が表示されていて、そのカラムに会社名が存在するケースです。
モデルは、以下のようになります。

@interface Organization : NSObject {
    NSString *name;
    NSString *address;
}

@interface Person : NSObject {
    NSString *name;
    NSInteger *age;
    NSString *address;
    Organization *organization;
}

Personのorganizationはnilの場合もあり、その場合は無所属です。
ここでNSTableViewに住所録を表示したとして、カラムに組織名があった場合、そのNSSortDescriptorのキーは次のように指定する事ができます。

[[NSSortDescriptor alloc] initWithKey:@"organization.name" ascending:YES selector:@selector(compar:)];

organizationのnameがnilの場合や、organizationがnilの場合でも正常に動作します。

キーバリューコーディングにおけるピリオドを使った参照オブジェクトの指定は、tableView:objectValueForTableColumn:row:を実装する時にも使えると思います。

広告
カテゴリー:開発 タグ: ,
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。