作成したカスタムNSViewがあります。基本的に、私が選択したツリービューの各アイテムについて、ビューを別のビューと交換したいと思います。
私の質問は、これにNSArrayControllerのようなものを使用する必要があるかどうかです。もしそうなら、どのようにカスタムNSViewを接続してNSArrayControllerを使用し、NSTreeViewでの選択に基づいてビューを交換しますか?
作成したカスタムNSViewがあります。基本的に、私が選択したツリービューの各アイテムについて、ビューを別のビューと交換したいと思います。
私の質問は、これにNSArrayControllerのようなものを使用する必要があるかどうかです。もしそうなら、どのようにカスタムNSViewを接続してNSArrayControllerを使用し、NSTreeViewでの選択に基づいてビューを交換しますか?
これを行うにはを使用できNSArrayController
ますが、考慮しなければならない点がいくつかあります。
それぞれNSView
をで制御する必要があるため、コントローラークラスと関連するNIBの両方を差し引くことができるNSViewController
識別子を自分に格納することをお勧めします。NSArrayController
クラス名を取得したらNSViewController
、それをインスタンス化し、付随するビューをinitWithNibName:
メソッドとともにロードできます。
「電流コントローラ」の概念を導入することはおそらく良い考えです。そうすれば、いつでも1つのコントローラー(関連付けられたビューとモデルオブジェクトグラフを含む)のみをメモリに保持できます。ツリービューでの選択に基づいてコントローラーを交換すると、古いコントローラーとそれに関連するすべてのオブジェクトがメモリから解放されます。
例:
NSArrayController
:@"Customers"
@"CustomersViewController"
@"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"
から発生する可能性がありますNSArrayController
。self
上記の例では、最上位のコントローラーを参照しています(そのクラスは設計によって異なります)。
ビューの実際の交換は、次のように実行できます。
[[self currentController] view] removeFromSuperView];
... do swapping ...
[[self view] addSubview:[[self currentController] view]];
NSArrayController
ツリービューにデータを入力するデータソースを使用して識別子を保存する場合は、ツリービューから選択したオブジェクトから識別子を直接取得できるため、別のデータはおそらく必要ありません。