Mac OS X 10.2でも動作させるための道のり
まずカラムがクリックされたことを受け取らなければなりません。NSOutlineViewの親クラス、NSTableViewには、
- (void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
というソートに適したメソッドがある(NSTableViewのdataSourceの接続先で呼ばれる)のですが、残念ながらこのメソッドはMac OS X 10.3以降でないと使えません。仕方ないので自分でカラムをクリックしたときを取得しなければならないので、今度は、
- (void)outlineView:(NSOutlineView *)outlineView mouseDownInHeaderOfTableColumn:(NSTableColumn *)tableColumn
を使おうとしたのですが、こいつもMac OS X 10.3以降でのみの実装らしいです。NSTableViewの同名のメソッドは10.2でもあると言うのに…。
で、仕方ないので、
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectTableColumn:(NSTableColumn *)tableColumn
を使うことにしました。この中でソートを行って、ソートの向きを表す画像をカラムにつけて、クリックされたカラムを選択表示して、データをリロードして、という処理を行い、最後にNOを返します。何故NOを返すのかと言うと、ここでYESを返してしまうと、既に選択されているカラムを再度選択したときにこのメソッドが呼び出されなくなってしまうからです。これでは「同じカラムを再度選択したときは整列の順序を逆にする」ことができなくなってしまいます(順序が決まっているのだったら気にしなくてもいいけど)。