2

我正在使用此代码在我的 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 与两个字符串进行比较..

4

2 回答 2

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];
于 2013-02-15T12:36:35.760 回答
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;
    }}];
于 2013-02-15T11:44:39.483 回答