SSブログ

Mac用USBデバイス-97 USB UI設計 [Mac用USBデバイス工作]

昨日、ユーザインターフェイスのスタイルを考え始めた。あんまりそういうところに労力を使ったことがないので頭の回転がさらに遅くなってしまう。
Cocoaバインディングを使えるようにしてなるべく簡単にすませたい。でも貧乏性なものでメモリの使用量が見やすいリンクトリストのようなものが使えるようにしたい。でもそれには制限があることがわかった。

5.2.1  UIのコーディング

マスタ・ディテール型のUIにするけど、できればテキストフィールドやボタンをずらずら並べるのはやりたくない。結局記述量は増えるしIntercafe Builderでの作業が複雑になって間違いのもとになる。

そうするとマスタもディテールもOutlineViewを使いたくなる。つまり
  • デスクリプタは入れ子関係があるのでそれを表現するOutlineView
  • その一つを選択すると、ディテール領域にそのなかのパラメータを表示
  • パラメータはやはりOutlineViewで表示されて編集ができる
  • それぞれのデスクリプタに対応するOutlineViewがTabViewに乗っていて切り替えられる
とすればInterface Builder上ではごちゃごちゃせずにすむ。
しかしそのためにはパラメータは構造体のメンバのような形ではなく、インデクスで指定できるような配列の要素になっていないといけない。その場合、構造体ならわかりやすい名前を付けておけるけど、配列にすると「何番目」という呼び方しかできなくなって、コーディング上は見通しが悪くなる。FORTRANを使っている人なら平気かもしれないけど、僕はすぐわからなくなってしまう。

逆にそうすれば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;
@end
nextをたどると並列に並んでいて、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を普通とは違ったやり方で使ってみたかっただけ。こういうのを試しておくとあとで使い道がある場合がある。覚えていれば、だけど。

これでいいはずだと思って簡単なテスト用の実装をしてみたら動かないことがわかった。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

献立04/27献立04/28 ブログトップ

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