4

いくつかのカスタム オブジェクトと 3 つのスコープ ( AllActive、およびFormer ) を使用して検索を作成します。以下のコードで動作するようになりました:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString *)scope {
    [[self filteredArtists] removeAllObjects];
    for (HPArtist *artist in [self artistList]) {
       if ([scope isEqualToString:@"All"] || [[artist status] isEqualToString:scope]) {
           NSComparisonResult result = [[artist displayName] compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
           if (result == NSOrderedSame) {
               [[self filteredArtists] addObject:artist];
           }
       }
    }
}

これはうまく機能し、scope考慮されます。一度に 4 つのフィールドを検索したかったので、この質問は次のコードを思いつくのに役立ちました。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString *)scope {
    [[self filteredArtists] removeAllObjects];
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"familyName CONTAINS[cd] %@ OR familyKanji CONTAINS[cd] %@ OR givenName CONTAINS[cd] %@ OR givenKanji CONTAINS[cd] %@", searchText, searchText, searchText, searchText];
    [[self filteredArtists] addObjectsFromArray:[[self artistList] filteredArrayUsingPredicate:resultPredicate]];
}

ただし、スコープは考慮されなくなりました。

私はステートメントをいじったり、ステートメントの最後に などをif追加したり、無駄に使用したりしてきました。スコープをアクティブにするたびに、一致するものが得られません。AND scope == 'Active'NSCompoundPredicates


このようなスコープを考慮したアプローチを見たことがあることに注意してください。ただし、それらは1つのプロパティ内のみを検索します。

4

1 に答える 1

4

これが私がそれを行う方法についてです:

NSPredicate * template = [NSPredicate predicateWithFormat:@"familyName CONTAINS[cd] $SEARCH "
                          @"OR familyKanji CONTAINS[cd] $SEARCH "
                          @"OR givenName CONTAINS[cd] $SEARCH "
                          @"OR givenKanji CONTAINS[cd] $SEARCH"];

- (void)filterContentForSearchText:(NSString *)search scope:(NSString *)scope {
  NSPredicate * actual = [template predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:search forKey:@"SEARCH"]];
  if ([scope isEqual:@"All"] == NO) {
    NSPredicate * scopePredicate = [NSPredicate predicateWithFormat:@"scope == %@", scope];
    actual = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:actual, scopePredicate, nil]];
  }

  [[self filteredArtists] setArray:[[self artistList] filteredArrayUsingPredicate:actual]];
}
于 2010-04-10T23:06:40.317 に答える