NSComparisonResult,如何将searchText与多个字符串进行比较?

时间:2013-02-15 11:31:30

标签: objective-c cocoa-touch search comparison tableview

我正在使用此代码在我的tableview中搜索:

for (Actor *actorz in arr)
{     
     NSComparisonResult result = [actorz.actorNaam compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:[actorz.actorNaam rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)]];
     if (result == NSOrderedSame)
     {
          [self.filteredListContent addObject:actorz];
     }   
}

现在我想知道如何不仅可以将searchText与actorz.actorNaam进行比较,还可以将其与actorz.actorBeschrijving进行比较?所以我想将searchText与两个字符串进行比较..

2 个答案:

答案 0 :(得分:5)

NSString的搜索方法会返回NSRange,如果找不到字符串,则位置设置为NSNotFound

因此,您可以通过验证结果位置 NSNotFound来检查是否找到了字符串。它可能听起来有点倒退,但逻辑是坚实的(两个否定,可以这么说)。

NSRange nameResult  = [actorz.actorNaam rangeOfString:searchText options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];
NSRange descrResult = [actorz.actorBeschrijving rangeOfString:searchText options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];

if ( nameResult.location != NSNotFound || descrResult.location != NSNotFound ) {
    [self.filteredListContent addObject:actorz];
}

请注意,此代码段将查找包含搜索字符串的名称,而不仅仅是名称相等。您可能希望使用原始代码更改它。你当然不得不放弃nameResult,因为它是多余的:

NSComparisonResult result = [actorz.actorNaam compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:[actorz.actorNaam rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)]];
NSRange descrResult = [actorz.actorBeschrijving rangeOfString:searchText options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];
    
if ( result == NSOrderedSame || descrResult.location != NSNotFound ) {
    [self.filteredListContent addObject:actorz];
}

然而,有一种更简单的方法。考虑使用谓词:

NSPredicate *actorPred = [NSPredicate predicateWithFormat:@"actorNaam contains[cd] %@ OR actorBeschrijving contains[cd] %@", searchText, searchText];

self.filteredListContent = [arr filteredArrayUsingPredicate:actorPred];

答案 1 :(得分:0)

我不完全确定你为什么要进行比较,我觉得检查你正在搜索的字符串中是否存在搜索文本似乎更有意义。如果这种方法适合你,你可以尝试一下:

NSArray *toCompareTo = @[actorz.actorNaam, actorz.actorBeschrijving];
[toCompareTo enumerateObjectsUsingBlock:^(NSString *object, NSUinteger index, BOOL *stop) {
    if ([object rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)].location != NSNotFound) {
        [self.filteredListContent addObject:object];
        *stop = YES;
    }}];