So-net無料ブログ作成
検索選択

NSSortDescriptorを使ったソートとNSTableViewでソートする方法 [Cocoa覚え書き]

NSSortDescriptorの使い方ですが、ドキュメントを読めば大方理解できると思いますが、念のため。
○対象となるデータ
 NSDitctionaryを全要素に含むNSArray
○NSSortDescriptorの作成とNSArrayへの格納
 NSSortDescriptorのインスタンス作成時のkeyとは、対象データ(上記のNSArray)に含まれるNSDictionaryのkeyを示す。
 すなわち、NSDictionaryにあるデータのうち、このkeyで格納されているもの(objectForKeyで得られるデータ)をソートすることである。
比較メソッド(compare:など)は、比較しようとするデータに実装されているメソッドを指定する。NSStringやNSDateなどはあらかじめが実装されているcompareでよい。
 ここで作成したNSSortDescriptorは、NSArrayにいれる(1つだけのときも)
○ソートの実行
 対象となるNSArrayのsortedArrayUsingDescriptors:を使って、作成したNSSortDescriptorを含むNSArray渡す。ソートの結果は戻り値のNSArrayに格納される。

NSTableViewでのソートのやりかた
 ここでは、datasourceを使ってNSTableViewのソートの方法についてですが、使わなくても、ほぼ変わりはないでしょう。
○Interface Builderでの定義
 Interface BuilderでNSTableViewのカラムを選択すると、ソートの定義がInfo Panelに表示される。
 このパネルで、keyと比較メソッドと昇順、降順の指定をする。
実際にNSTableViewが動作しているときにカラムヘッダをクリックすると、この値を使ってNSTableViewがNSSortDescriptorを作成する。
○ソートの実行
 datasouceを使う場合、
tableView:objectValueForTableColumn:row:の呼び出されることにより、NSTableViewへデータを送るのだが、少なくともそのまえに
NSTableViewのsortDescriptorsメソッドでNSSortDescriptorを取得して、ソートを実行する。
表示されているNSTableViewのカラムヘッダにソートのインジケータ(上、下向き三角)が表示されていれば、sortDescriptorsメソッドは、Interface Builderで設定した値で作成されたNSSortDescriptorを要素に持つNSArrayを返す。(インジケータがないときは、NSArrayの要素は0個)。
このNSArrayを使って表示しようとしているデータをソートする。
 すなわち、NSTableViewでこの仕組みを利用して、ソートを使う場合には、プログラム内部で持っているデータは、NSDictionaryを要素に持つNSArrayを用意しておかなければならない。
Interface Builderでソートの設定で指定するkeyは、内部データ構造上のkeyを指定するということである。
○カラムをクリックしたときの再表示
 NSTableViewにソート指定されている場合には、ソートのインジケータが表示される。カラムヘッダがクリックされた場合、インジケータの方向が変わる。
 このとき、datasouceをしてしている場合、インジケータが変わった直後にtableView:sortDescriptorsDidChange:が呼び出されるので、NSTableViewのreloadDataを呼び出す(この結果、再表示が実行される)。渡される引数のNSSortDescriptorは特に気にする必要はない(次のNSTableViewのsortDescriptorsで得られるNSSortDescriptorは、ビューと連動してに変わっている)。


nice!(0)  コメント(0)  トラックバック(1) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。

関連リンク

Copyright © 2005-2009, Finky All Rights Reserved.

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。