0

「コンテンツ」と呼ばれる配列にバインドされたツリーコントローラーがあります。「コンテンツ」は、「車」と呼ばれるモデル オブジェクトの配列です。各「Car」には、「carName」という名前の NSString と「mostPopularColors」という名前の NSMutableArray が含まれています。「mostPopularColors」には、「最も人気」、「2 番目に人気」、「3 番目に人気」などのキーと、「赤」、「緑」、「青」などの値を持つ NSMutableDictionary オブジェクトが含まれます。

アウトライン ビューは、ツリー コントローラーに配置されたオブジェクトにバインドされ、すべての「Car」の「carName」を「content」に表示します。別のテーブル ビューでは、すべての「carName」が 1 つの列に一覧表示されます。これは、配列コントローラーをツリー コントローラー (コントローラー キー: selection、モデル キー パス: allChildLeafs) にバインドすることによって行われます。テーブルの列の値は、配列コントローラーの配置されたオブジェクト、モデル キー パス: carName にバインドされます。

テーブル ビューには、最も人気のある色と 2 番目に人気のある色をそれぞれリストする 2 つの列が必要です。したがって、最終的なテーブルには、すべての車の名前と各車の最も人気のある 2 つの色をリストする 3 つの列が必要です。

説明どおりに車の名前にアクセスできますが、色自体は配列にあるためアクセスできません。

2 番目のアレイ コントローラを作成して最初のアレイ コントローラにリンクしようとしましたが、動作しません。

最終的には、アウトライン ビューで 1 つまたは複数の車を選択し、すべての名前とそれぞれの上位 2 つの色をテーブル ビューで表示できるようにしたいと考えています。

4

1 に答える 1

0

2 つのアレイ コントローラを 1 つのテーブル ビューに接続できないため、2 つ目のアレイ コントローラが機能しなかったようです。

ツリー コントローラー (コントローラー キー: selection、モデル キー パス: allChildLeafs) にバインドされていた配列コントローラーはそのまま残りましたが、どのビューにもバインドされていませんでした。

Xcode で IBOutlet NSArrayController が作成され、Interface Builder (IB) で新しく作成されたアレイ コントローラーに接続されました。また、setter メソッドと getter メソッドを使用して、新しい NSMutableArray が宣言されました。次に、次のコードを使用して、配列コントローラーを新しい NSMutableArray にバインドしました。

[newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"mutableArray" options:nil];

したがって、配列コントローラーは、新しい可変配列にあるものは何でも「保持」します。新しいアレイ コントローラをテーブル ビューに接続すると、アレイの内容をテーブル ビューに表示できます。

必要なのは、この可変配列に各車の NSMutableDictionary オブジェクトを含めることだけでした。各ディクショナリには 3 つのキーと値のペアがあります。3 つのキーは、「carName」、「mostPopularColor」、「secondMostPopularColor」です。

古い配列コントローラーは現在アウトライン ビューで選択されている "Car" オブジェクトの配列を保持していたので、これはまず "Car" オブジェクトの配列を取得することによって行われました。これを行うために、古い配列コントローラーの ArrangeObjects の変更が観察され、「Car」オブジェクトの新しい配列が以下を使用して観察されました。

[oldArrayController addObserver:self forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionNew context:nil];

観測を処理し、「Car」オブジェクトの新しい配列を使用して辞書オブジェクトの最終的な配列を取得するために、次のメソッドが実装されました。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  {if (object == selectedChildLeafsController)
{
    if ([[object arrangedObjects] count] > 0)
    {//make a new mutable array, here called "array", of dictionaries from your array of "Car" objects which is found in [object arrangedObjects] . And then something like...
    [self setMutableArray: array];
    [newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"selectedBonds" options:nil];}else
{
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}}
于 2011-12-04T12:21:44.033 に答える