Mac用USBデバイス-97 USB UI設計 [Mac用USBデバイス工作]
昨日、ユーザインターフェイスのスタイルを考え始めた。あんまりそういうところに労力を使ったことがないので頭の回転がさらに遅くなってしまう。
Cocoaバインディングを使えるようにしてなるべく簡単にすませたい。でも貧乏性なものでメモリの使用量が見やすいリンクトリストのようなものが使えるようにしたい。でもそれには制限があることがわかった。
そうするとマスタもディテールもOutlineViewを使いたくなる。つまり
逆にそうすればInterface Builderでの作業が簡単になるのと、NSTreeControllerが使える可能性が出てくる。これができれば非常に楽。
NSArrayでなくてもNSTreeControllerは使える。要するにKey-Valueコーディングを使ったときにNSArrayと同じ動作をするオブジェクトであればよくて、そのオブジェクトをNSTreeControllerのcontentに指定すればいい。
例えばcountはいくつつながっているか、を返す。これはリカーシブにnextをたどって数えればいい。
これでNSTreeControllerがcontentに期待するkey-valueコーディングによる応答を実装すればいい。何を実装するかはこのドキュメントがある。
このやりかたの何がいいか、というと特に利点はなくて単にNSTreeControllerを普通とは違ったやり方で使ってみたかっただけ。こういうのを試しておくとあとで使い道がある場合がある。覚えていれば、だけど。
これでいいはずだと思って簡単なテスト用の実装をしてみたら動かないことがわかった。
Cocoaバインディングを使えるようにしてなるべく簡単にすませたい。でも貧乏性なものでメモリの使用量が見やすいリンクトリストのようなものが使えるようにしたい。でもそれには制限があることがわかった。
5.2.1 UIのコーディング
マスタ・ディテール型のUIにするけど、できればテキストフィールドやボタンをずらずら並べるのはやりたくない。結局記述量は増えるしIntercafe Builderでの作業が複雑になって間違いのもとになる。そうするとマスタもディテールもOutlineViewを使いたくなる。つまり
- デスクリプタは入れ子関係があるのでそれを表現するOutlineView
- その一つを選択すると、ディテール領域にそのなかのパラメータを表示
- パラメータはやはりOutlineViewで表示されて編集ができる
- それぞれのデスクリプタに対応するOutlineViewがTabViewに乗っていて切り替えられる
逆にそうすればInterface Builderでの作業が簡単になるのと、NSTreeControllerが使える可能性が出てくる。これができれば非常に楽。
NSArrayでなくてもNSTreeControllerは使える。要するにKey-Valueコーディングを使ったときにNSArrayと同じ動作をするオブジェクトであればよくて、そのオブジェクトをNSTreeControllerのcontentに指定すればいい。
5.2.2 NSTreeController用contentオブジェクト
例えばこんなのを考えてみる。@interface PseudoArray : NSObject { PseudoArray *next; PseudoArray *children; NSString *name; } - (NSUInteger)count; - (id)objectAtIndex:(NSUInteger)index; - (id)children; - (NSUInteger)countOfChildren; - (id)objectInChildrenAtIndex:(NSUInteger)index; - (NSString *)name; - (BOOL)canAdd; - (BOOL)canAddChild; - (void)add:(id)newOne; - (void)addChild:(id)newChild; @endnextをたどると並列に並んでいて、childrenをたどると子供が並んでいる。インスタンス変数のnameはとりあえず内容を代表したもの。これをデスクリプタごとに作る。ようするに配列と要素を合体させたようなもので、LISPのcons cellが内容も一緒に保持しているという感じ。
例えばcountはいくつつながっているか、を返す。これはリカーシブにnextをたどって数えればいい。
- (NSUInteger)count { if (next == nil) return 1; else return [next count] + 1; }こんなの。効率は悪いけど簡単。これを例えば
root = [[PseudoArray alloc] init]; [treeController setContent:root];としてやればいい。setContentは、treeControllerをnibに乗せてあればInteface Builderのバインディングパネルでもできる。
これでNSTreeControllerがcontentに期待するkey-valueコーディングによる応答を実装すればいい。何を実装するかはこのドキュメントがある。
このやりかたの何がいいか、というと特に利点はなくて単にNSTreeControllerを普通とは違ったやり方で使ってみたかっただけ。こういうのを試しておくとあとで使い道がある場合がある。覚えていれば、だけど。
これでいいはずだと思って簡単なテスト用の実装をしてみたら動かないことがわかった。
2010-04-27 21:48
nice!(0)
コメント(0)
トラックバック(0)
コメント 0