0

我有一个 tableView,它有 5 个不同的可能数据源,具体取决于标志对象(NSNumber *)dataSourceAssignment。我已经实现了一个NSSortDescriptor按.dataSource(float)confidenceRating

分配数据源后,我需要能够通过(NSString *)genre. 我了解如何使用来过滤我的数组,但是当有 5-6 个不同的字符串可以检查NSPredicate时,我无法弄清楚如何有效地做到这一点。genre

用户能够“检查”多个流派,这些流派基本上应该根据选择的流派来切换曲目的显示。我正在考虑创建一个NSUserDefaults *defaults看起来像这样的字典:["genre1" = YES, "genre2" = NO, "genre3" = YES ...].

如何设置NSPredicate使用流派字典过滤数据源,而不使用带有大量条件的巨大 if/switch 语句。

这是我在NSPredicate实现之前的代码:

- (void)assignDataSource
{
switch (dataSourceAssignment.intValue) {
    case 0:     dataSource = [NSMutableArray arrayWithArray:tracksArray];           break;
    case 1:     dataSource = [NSMutableArray arrayWithArray:favoriteTracks];        break;
    case 2:     dataSource = [NSMutableArray arrayWithArray:topTracksOfTheWeek];    break;
    case 3:     dataSource = [NSMutableArray arrayWithArray:topTracksOfTheMonth];   break;
    case 4:     dataSource = [NSMutableArray arrayWithArray:topTracksOfTheYear];    break;
    default:    break;
}

if (dataSourceAssignment.intValue >= 2)  {
    NSSortDescriptor *avgRatingSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"confidenceRating" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:avgRatingSortDescriptor, nil];
    NSArray *sortedArray = [dataSource sortedArrayUsingDescriptors:sortDescriptors];
    dataSource = [NSMutableArray arrayWithArray:sortedArray];
}
4

2 回答 2

1

当你使用 时predicateWithFormat,你可以传递一个关于谓词的正则表达式语句。该字符串是您可以执行多个谓词的地方,因此可以在选择不同类型时进行更改。

例如,您可以有:predicateWithFormat:predicateString,然后predicateString设置为类似于"SELF beginswith genre1 AND SELF beginswith genre1"如果用户选择了流派 1 和流派 2。虽然肯定会仔细检查我使用的正则表达式,但因为你需要比它更好的东西才能正常工作。

于 2012-08-03T00:42:17.400 回答
1

您可以将选择的流派存储到数组中,然后使用谓词。当用户选择/取消选择元素时,您还可以删除/添加元素。

NSArray *selectedGenresByUser = [NSArray arrayWithObjects:@"genre1",@"genre2", nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"genre in $SELECTED_GENRES"];
predicate = [predicate predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:[NSArray arrayWithArray:selectedGenresByUser] forKey:@"SELECTED_GENRES"]];
//then use predicate to filter datasource array( maby you can store all elements in one array)
于 2012-08-03T06:34:23.903 回答