NSArrayController を使った NSTableView で選択行の情報を取得する

2010年12月2日木曜日 | Published in | 1 コメント

このエントリーをはてなブックマークに追加

NSArrayController でソート(SortDescriptors)を使っている場合の選択行の取得方法について。

-[NSTableViewDeleage tableView:shouldSelectRow:] で得た NSTableView上の選択位置 row を使って単純にモデル配列内の選択行を取り出す場合はこんな感じになる。
id obj = [modelArray objectAtIndex:row];
これは画面上でソートしている場合間違った行情報を取得することになる。
イメージ
NSTableView
 ↑
NSArrayController(ソートされている)
 ↓
モデル配列
画面上はソートした一覧が表示されていて、その並び順を元に選択位置 row を NSTableViewDelegateで通知する。つまり、
画面上:
 0:バナナ
 1:りんご
 2:苺

モデル配列:
 0:苺
 1:バナナ
 2:りんご
のようなケースが有りえて画面で「バナナ」を選択した場合 row=0 となるが、それをそのままモデル配列に当てはめると「苺」をさ指定しまう。


なので NSTableViewDelegate の受け側では渡された row を元に情報を取得する場合、オリジナルのモデル配列を使うのではなく画面上の並びに一致する NSArrayController のオブジェクトから情報を取得する必要がある。

NSArrayControlelr からの選択行の取り出しには -[arrangedObjects] を使う。これで取得した配列に対して objectAtIndex: を投げて目的の行情報を取得する。
id obj = [[arrayController arrangedObjects] objectAtIndex:row];

なお NSArrayController には選択行向けのメソッドが用意されている。
NSArrayController Class Reference
親クラスの NSObjectController にもある。
NSObjectController Class Reference

が、これらを使って意図通りの情報を取得することができなかった。使い方が悪いのか、設定が不足しているのか。もう少し調べる必要あり。

コメント

  1. ぎりるとあち says:
    2015年5月21日 8:56

    分かりやすい解説ありがとうございます。
    ところでCore DataとArrayControllerを使って、入力したデータを取得しようとしているのですが、[arrayController arrangedObjects]を実行してもnullが帰ってくるだけで、取得できません。どうしてでしょうか。
    失礼しました。

  2. ぎりるとあち says:
    2015年5月21日 8:56

    分かりやすい解説ありがとうございます。
    ところでCore DataとArrayControllerを使って、入力したデータを取得しようとしているのですが、[arrayController arrangedObjects]を実行してもnullが帰ってくるだけで、取得できません。どうしてでしょうか。
    失礼しました。

Leave a Response

人気の投稿(過去 30日間)