Obj.C

obj.C:表のソートとpull down menu

前々から表のソートができるはずと思いながら放っていたのですが、やっと着手しました。

ソートの仕方

表のソートは、NSTableViewが実装できていれば、ソート条件とソートの実行の2行を追加するだとわかりました。早速、実装してOKになりました。

NSMutableArray *wkArray;//NSTableViewと連動
NSSortDescriptor *tempSort = [NSSortDescriptor sortDescriptorWithKey:@”fSort” ascending:YES];//ソート条件
wkArray = [[wkArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:tempSort]]copy]; //ソート

表は、通常、必ず列(column)が2列以上存在しますから2次元の配列になります。このためむずかしそうだと二の足を踏んでいたのですが、意外と簡単で助かりました。

表の行(row)が追加・挿入・削除されたときにソートするフラグをセットし、一連の処理が終わったところでソートすることにしました。ちょうど、表示行を選択する箇所(selectRow)が共通メソッドになっていますので、そのなかにソートを入れました。この安直な修正は、本来、「ファイル名かフォルダ名が変更・追加になったときソートする」べきということから外れています。それで、実際やってみても不具合がありました。今から、少し真剣に修正したいと思います。

なお、配列のソートを参照しました。このサンプルはNSTableViewを実装したときの2次元配列と同じ構成なので、見ただけでソートの箇所の2行だけを実装すればいいとわかりました。

ところで、仕様は、入力順にソート、フォルダ&ファイル名順にソートの両方ともユーザー指定でできるようにするべきでしょうか。それとも、フォルダ&ファイル名順だけでもいいでしょうか。フォルダ名やファイル名の変更ができるようにすれば、ひとつに絞ってもいいような気がしていますが、どうでしょうか?

メモ:列のタイトルが選ばれたときにソートするには、Interface Builderで設定してもいいし、次のようなコードを書いてもいいようです。コードを書いていたのですが、欲しい機能と違ったので、今は削除しました。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@”fFileSort” ascending:YES];//
mmMesaTViewCont *mmMesaTViewCont= [[MesaTViewCont alloc] init]; //表wkArrayのインスタンス化と初期化
NSArray *descriptors = [NSArray arrayWithObject:sortDescriptor];//
[tableView setSortDescriptors: descriptors]; //

プルダウンメニュ

今まで、表の中のマウスカーソルの位置にプルダウンメニュを表示して削除できるようにしようと考えていたのですが、そこまでしなくてもそれなりの操作性を確保できる方法がわかりました。NSPopUPButtonCellをInterface Builderで次のように、デフォルトで文字やボタンを表示しないようにし、NSPopUPButtonCellがクリックされたときにpull down menuが現れるようにすればそれらしくなります(その操作性の出来具合についての評価は主観によります)。Type / Arrow / Visual / Titleの箇所がそうです。

スクリーンショット 2014-04-02 12.46.55

課題リスト

日付で管理しようと思っていたら、日付よりか、versionの方が良さそうですね。この方が、あとから何をどのバージョン/レビジョンで直したか、遡れます。長いことプログラムを書いていないと、こんなこともわからなくなっていました。