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は、ビューと連動してに変わっている)。
トラックバック 1
さて、前回(http://tbboy.cocolog-nifty.com/tbb







コメント 0