3

オブジェクトの NSArray があり、それらのオブジェクトには 10 個のプロパティがあります。それらのオブジェクトのテキスト検索をしたいと思います。

一度に 1 つのプロパティを検索する方法は知っていますが、すべてのプロパティを一度に簡単に検索する方法はありますか?

私のオブジェクトが持っているプロパティのリストは次のとおりです。

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * phone;
@property (nonatomic, retain) NSString * secondaryPhone;
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSString * url;
@property (nonatomic, retain) NSString * category;
@property (nonatomic, retain) NSString * specialty;
@property (nonatomic, retain) NSString * notes;
@property (nonatomic, retain) NSString * guid;

"doctor" を検索すると、これらのプロパティの 1 つ以上に "doctor" という単語が含まれるすべての結果が表示されます。たとえば、あるオブジェクトのカテゴリが「医師」で、別のオブジェクトの電子メール アドレスが「smith@doctorsamerica.com」の場合、両方が結果に表示されます。

4

3 に答える 3

14
 NSString *searchTerm = @"search this";
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF LIKE[cd] %@", searchTerm];
 NSArray *filtered = [array filteredArrayUsingPredicate:predicate];

特定のプロパティがある場合は、述語を次のように変更できます。

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.propertyName LIKE[cd] %@", searchTerm];

すべてのプロパティを検索するには、それらを論理演算子でバインドする必要があります

  NSString *query = @"blah";
  NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name contains[cd] %@", query];
  NSPredicate *predicatePhone = [NSPredicate predicateWithFormat:@"phone contains[cd] %@", query];
  NSPredicate *predicateSecondaryPhone = [NSPredicate predicateWithFormat:@"secondaryPhone contains[cd] %@", query];
  NSArray *subPredicates = [NSArray arrayWithObjects:predicateName, predicatePhone, predicateSecondaryPhone, nil];

  NSCompoundPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
于 2013-10-10T16:49:40.440 に答える
0

クラスにメソッドを追加matches:します。

- (BOOL)matches:(NSString *)term {
    if ([self.name rangeOfString:term options:NSCaseInsensitiveSearch| NSDiacriticInsensitiveSearch].location != NSNotFound) {
        return YES;
    } else if ([self.phone rangeOfString:term options:NSCaseInsensitiveSearch| NSDiacriticInsensitiveSearch].location != NSNotFound) {
        return YES;
    } else if (...) { // repeat for all of the properties
        return YES;
    }

    return NO;
}

これで、各オブジェクトをチェックしてオブジェクトを反復処理できます。

NSArray *peopleArray = ... // the array of objects
NSString *someTerm = ... // the search term
NSMutableArray *matches = [NSMutableArray array];
for (id person in peopleArray) {
    if ([person matches:someTerm]) {
        [matches addObject:person];
    }
}
于 2013-10-10T18:30:05.217 に答える