1

我正在开发一个不基于核心数据的应用程序 - 数据馈送是一系列 Web 服务。

从数据馈送中创建了两个数组。第一个保存季节数据,每个数组对象都是一个 NSDictionary。两个 NSDictionary 条目保存要在弹出窗口中显示的数据 ('seasonName') 和一个 id ('seasonID'),它充当为该季节定义的匹配项的指针(在外部表中)。

第二个数组也是 NSDictionaries 的集合。其中两个条目包含要在弹出窗口中显示的数据 ('matchDescription') 和指向第一个数组中 NSDictionaries 中定义的 seasonId 的 id ('matchSeasonId')。

我有两个 NSPopUp。我希望第一个显示季节名称,第二个显示为该季节定义的匹配项,具体取决于第一个中的选择。

我是绑定新手,所以如果我错过了一些明显的东西,请原谅。我尝试使用 ArrayControllers 如下:

SeasonsArrayController:内容绑定到appDelegate seasonsPopUpArrayData。

seasonsPopup:绑定到 SeasonsArrayController.arrangedObjects 的内容;绑定到 SeasonsArrayController.arrangedObjects.seasonName 的内容值

我看到季节名称很好。我显然可以按照类似的路线查看比赛,但我会看到所有比赛,而不是将列表限制在突出显示的赛季的比赛中。

我能找到的所有教程似乎都围绕核心数据并利用其中定义的关系。我这里没有那种奢侈。非常感激地收到任何帮助。

4

1 回答 1

0

这不是一个答案——更多的是前一个问题的延伸。

我创建了 MatchesArrayController 并将其从 NSArrayController 子类化以允许进行一些自定义。

按照'Cocoa Bindings Topics'中的'Filtering Using a Custom Array Controller'中的示例,我遵循与上述相同的想法:MatchessArrayController:内容绑定到appDelegatematchesPopUpArrayData。

matchesPopup:内容绑定到 MatchesArrayController.arrangedObjects;绑定到 MatchesArrayController.arrangedObjects.matchDescription 的内容值。

我从 seasonPopUp:sender 派生了选定的项目,并用它来识别 seasonId。这个想法是通过定义以下内容来更改 MatchesArrayController 中的排列对象;

- (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 方法,但没有。我必须明确地称呼它(即[matchesArrayControllerarrangeObjects:matchesPopUpArrayData];)

即便如此,尽管过滤对象按照预期的方式进行了更改,但下拉列表并没有按照我想要的方式进行更新。

于 2009-12-31T19:01:15.467 回答