1

作成したカスタムNSViewがあります。基本的に、私が選択したツリービューの各アイテムについて、ビューを別のビューと交換したいと思います。

私の質問は、これにNSArrayControllerのようなものを使用する必要があるかどうかです。もしそうなら、どのようにカスタムNSViewを接続してNSArrayControllerを使用、NSTreeViewでの選択に基づいてビューを交換しますか?

4

1 に答える 1

2

これを行うにはを使用できNSArrayControllerますが、考慮しなければならない点がいくつかあります。

それぞれNSViewをで制御する必要があるため、コントローラークラスと関連するNIBの両方を差し引くことができるNSViewController識別子を自分に格納することをお勧めします。NSArrayControllerクラス名を取得したらNSViewController、それをインスタンス化し、付随するビューをinitWithNibName:メソッドとともにロードできます。

「電流コントローラ」の概念を導入することはおそらく良い考えです。そうすれば、いつでも1つのコントローラー(関連付けられたビューとモデルオブジェクトグラフを含む)のみをメモリに保持できます。ツリービューでの選択に基づいてコントローラーを交換すると、古いコントローラーとそれに関連するすべてのオブジェクトがメモリから解放されます。

例:

  • あなたの中に保管してくださいNSArrayController@"Customers"
  • コントローラクラス:@"CustomersViewController"
  • 関連するNIB:@"CustomersView"

配列に格納する@"Customers"ことで、正しいコントローラークラス名と関連するNIBを差し引くことができます。

NSString *aControllerName = [anIdentifier stringByAppendingString: @"ViewController"];
NSString *aNibName = [anIdentifier stringByAppendingString: @"View"];   
Class aControllerClass = NSClassFromString(aControllerName);
[self setCurrentController: [[aControllerClass alloc] initWithNibName: aNibName bundle: [NSBundle mainBundle]]];

上記のコードanIdentifierでは、値を保持し、@"Customers"から発生する可能性がありますNSArrayControllerself上記の例では、最上位のコントローラーを参照しています(そのクラスは設計によって異なります)。

ビューの実際の交換は、次のように実行できます。

[[self currentController] view] removeFromSuperView];
... do swapping ...
[[self view] addSubview:[[self currentController] view]];

NSArrayControllerツリービューにデータを入力するデータソースを使用して識別子を保存する場合は、ツリービューから選択したオブジェクトから識別子を直接取得できるため、別のデータはおそらく必要ありません。

于 2012-08-01T00:18:19.010 に答える