0

フラグオブジェクトに応じて、5 つの異なるデータソースを持つ tableView があります(NSNumber *)dataSourceAssignmentNSSortDescriptorでソートするを実装しましdataSource(float)confidenceRating

データソースが割り当てられたら、dataSource 配列を(NSString *)genre. 配列をフィルタリングする方法は理解していますが、チェックできる文字列NSPredicateが 5 ~ 6 個ある場合に効率的に行う方法がわかりません。genre

ユーザーは複数のジャンルを「チェック」することができ、基本的にどのジャンルが選択されているかに従ってトラックの表示を切り替える必要があります。NSUserDefaults *defaults次のような辞書を作成することを考えていました: ["genre1" = YES, "genre2" = NO, "genre3" = YES ...].

NSPredicate大量の条件を含む巨大な if/switch ステートメントを使用せずに、ジャンル辞書を使用してデータソースをフィルタリングするように設定するにはどうすればよいですか。

NSPredicateaが実装される前に私が持っているコードは次のとおりです。

- (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

選択されたジャンルを配列に格納して、述語を使用できます。ユーザーが要素を選択/選択解除するときに、要素を削除/追加することもできます。

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 に答える
1

を使用するpredicateWithFormatと、述語に関する正規表現ステートメントを渡すことができます。その文字列は、複数の述語を実行できる場所であり、さまざまなジャンルが選択されたときに変更できるものです。

たとえば、ユーザーがジャンル 1 とジャンル 2 を選択した場合、次のようpredicateWithFormat:predicateStringpredicateString設定できます。"SELF beginswith genre1 AND SELF beginswith genre1"私が使用した正規表現を再確認することは間違いありませんが、うまく機能させるにはそれよりも優れたものが必要です。

于 2012-08-03T00:42:17.400 に答える