1

コア データ ベースではないアプリに取り組んでいます。データ フィードは一連の Web サービスです。

データ フィードから 2 つの配列が作成されます。1 つ目は季節データを保持し、各配列オブジェクトは NSDictionary です。2 つの NSDictionary エントリは、ポップアップに表示されるデータ ('seasonName') と、そのシーズンに定義された一致によって (外部テーブルで) ポインターとして機能する ID ('seasonID') を保持します。

2 番目の配列も NSDictionaries のコレクションです。2 つのエントリは、ポップアップに表示されるデータ (「matchDescription」) と、最初の配列の NSDictionaries で定義されたシーズン ID を指す ID (「matchSeasonId」) を保持します。

2 つの NSPopUp があります。最初の選択に応じて、最初にシーズン名を表示し、2 番目にそのシーズンに定義された試合を表示します。

私はバインディングが初めてなので、何か明らかなことを見逃していたらすみません。次のようにArrayControllersを使用してみました:

SeasonsArrayController: appDelegate seasonsPopUpArrayData にバインドされたコンテンツ。

seasonsPopup: SeasonsArrayController.arrangedObjects にバインドされたコンテンツ。SeasonsArrayController.arrangedObjects.seasonName にバインドされた content 値

季節の名前はよくわかります。もちろん、同様のルートで試合を見ることもできますが、ハイライトされたシーズンの試合にリストを制限するのではなく、すべての試合を見ることができます。

私が見つけることができるすべてのチュートリアルは、コアデータを中心に展開し、そこで定義された関係を利用しているようです. ここにはそんな贅沢はありません。どんな助けも非常に感謝して受け取りました。

4

1 に答える 1

0

これは答えではありません。以前の問題の延長です。

MatchesArrayController を作成し、NSArrayController からサブクラス化して、カスタマイズできるようにしました。

「Cocoa バインディング トピック」の「カスタム配列コントローラーを使用したフィルタリング」の例に従って、上記と同じ考え方に従いました。

matchesPopup: MatchesArrayController.arrangedObjects にバインドされたコンテンツ。MatchesArrayController.arrangedObjects.matchDescription にバインドされたコンテンツ値。

選択したアイテムを seasonPopUp:sender から派生させ、これを使用して seasonId を識別しました。アイデアは、MatchesArrayController で次のように定義することにより、arrangedObjects を変更することです。

- (NSArray *)arrangeObjects:(NSArray *)objects
{
    if (searchString == nil) {
        return [super arrangeObjects:objects];
    }

    NSMutableArray *filteredObjects = [NSMutableArray arrayWithCapacity:[objects count]];
    NSEnumerator *objectsEnumerator = [objects objectEnumerator];
    id item;

    while (item = [objectsEnumerator nextObject]) {
        if ([[[item valueForKeyPath:@"matchSeasonId"] stringValue] rangeOfString:searchString options:NSAnchoredSearch].location != NSNotFound) {
            [filteredObjects addObject:item];
        }
    }
    return [super arrangeObjects:filteredObjects];
}

- (void)searchWithString:(NSString *)theSearchString {
    [self setSearchString:theSearchString];
    [self rearrangeObjects];
}

- (void)setSearchString:(NSString *)aString
{
   [aString retain];
    [searchString release];
    searchString=aString;
}

私は NSLog を使用して、物事が想定どおりに起こっていることを確認しましたが、すべて問題ないようです。しかし、それはまだ私が望むことをしません。

[自己再配置オブジェクト]; ArrangeObjects メソッドを呼び出すはずですが、そうではありません。明示的に呼び出す必要があります (ie[matchesArrayController ArrangeObjects:matchesPopUpArrayData]; )

それでも、filteredObjects は想定どおりに変更されますが、ドロップダウン リストは希望どおりに更新されません。

于 2009-12-31T19:01:15.467 に答える