いくつかのカスタム オブジェクトと 3 つのスコープ ( All、Active、および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つのプロパティ内のみを検索します。