Mac用USBデバイス-98 やっぱりNSMutableArrayじゃなきゃ [Mac用USBデバイス工作]
昨日NSTreeControllerのcontentとして、NSMutableArrayと同じ振る舞いをするLISPのCons Cellのようなリンクトリストを使おうとしたが実はそれはうまくいかなかった。なぜなのか。
しばらくいじり回していて、ようやく原因がわかった。NStreeController自身の問題ではなくてNSOutlineViewとの関係だった。
表示のためにウィンドウにNSOutlineViewを貼付けて、nameコラムを作った。それに対応するNSTableColumnのvalueのバインディング先をtreeControllerのarrangedObjectsのnameキーにした。
これでいいだろうと思っていたらダメ。実はNSOutlineViewはNStableColumnに対応するvalueを、一つ一つの要素に投げるのではなく、NSArrayに投げ、要素のvalueのNSArrayを表示していた。 つまりNSArrayには
僕のPseudoArrayは配列と要素が同じものになっている。先頭の要素にnameキーでvalueを得るとき、それがその要素に投げられたものか、それとも配列全体として投げられたものかわからない。
つまりNSTreeController+NSOutlineViewを使うためには配列とその要素は別のオブジェクトでなければならない、ということ。NSOutlienViewが使えなければNSTreeControllerを使う意味はほとんどない。
5.2.3 なぜダメか
どうなるかというと、NSOutlineViewの上でトップレベルの最初の一つしか表示されない。実はずいぶんなやんだ。ドキュメントにあるキーを順に実装したり除いたりして動作を確認したがダメ。しばらくいじり回していて、ようやく原因がわかった。NStreeController自身の問題ではなくてNSOutlineViewとの関係だった。
表示のためにウィンドウにNSOutlineViewを貼付けて、nameコラムを作った。それに対応するNSTableColumnのvalueのバインディング先をtreeControllerのarrangedObjectsのnameキーにした。
これでいいだろうと思っていたらダメ。実はNSOutlineViewはNStableColumnに対応するvalueを、一つ一つの要素に投げるのではなく、NSArrayに投げ、要素のvalueのNSArrayを表示していた。 つまりNSArrayには
- (id)valueForKey:(NSString *)key;メソッドがあって、それぞれの要素にこのメソッドを投げた結果の配列を返すようになっている。NSOutlineViewはひとつのコラムの値を得るのに、それぞれの要素を調べるのではなくて同一レベルにある要素すべての値の配列を使っていた。このほうがNSArrayの中を外からスキャンするより効率を上げることができる(もちろんNSArrayの実装次第だけど)。
僕のPseudoArrayは配列と要素が同じものになっている。先頭の要素にnameキーでvalueを得るとき、それがその要素に投げられたものか、それとも配列全体として投げられたものかわからない。
つまりNSTreeController+NSOutlineViewを使うためには配列とその要素は別のオブジェクトでなければならない、ということ。NSOutlienViewが使えなければNSTreeControllerを使う意味はほとんどない。
5.2.4 結局どうするのか
結局素直に- 一つのパラメータ(bLengthなど)は名前や型や値を専用のクラス(あるいはNSDictionary)で保持する
- それを一つのNSArrayに保持してひとつのデスクリプタを表す
- さらにそれをNSArrayに入れてデバイスデスクリプタ以下、全体を表す
- NSTreeControllerとNSOutlineViewをCocoaバインディングで結ぶ
2010-04-28 21:49
nice!(0)
コメント(0)
トラックバック(0)
コメント 0