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

问题描述:

我使用这个代码在我的tableview搜索:NSComparisonResult,如何将searchText与多个字符串进行比较?

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两个字符串..

+0

,此方法只搜索的SEARCHTEXT到演员......的名字,如果它的发现,它的加入到filteredListContent阵列...但我不想只在搜索(actorz.actorNaam),但也在actorz.actorBeschrijving中。 – Fuzej 2013-02-15 12:00:07

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]; 
+0

如何将2个NSRanges,nameResult en descrResult与我的旧代码结合使用? – Fuzej 2013-02-15 14:24:43

+0

谢谢。 我可以在actorz.actorBeschrijving上搜索,但搜索正在提供我没有搜索到的结果。 – Fuzej 2013-02-19 12:35:18

+0

感谢您的帮助,但是,但是,你能解释我多一点:'if(result == NSOrderedSame || descrResult.location!= NSNotFound)' – Fuzej 2013-02-19 12:45:05

我不完全确定你为什么要做一个比较,它似乎对我来说更有意义检查字符串中是否存在搜索文本正在重新搜索。如果这种方法适合你,你可以试试这个:

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; 
    }}]; 
+0

'for(Actor * actorz in arr) { toCompareTo = @ [actorz.actorNaam,actorz.actorBeschrijving]; [toCompareTo enumerateObjectsUsingBlock:^(的NSString *对象,NSUInteger索引,BOOL *停止){ 如果([对象​​rangeOfString:SEARCHTEXT选项:!(NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)]位置= NSNotFound){ [self.filteredListContent ADDOBJECT:对象]。 * stop = YES; }}]; }' 给了我这个错误: [__NSPlaceholderArray initWithObjects:数:]:尝试从物体插入零对象[1] – Fuzej 2013-02-15 11:56:26

+0

所以你的领域之一是'nil',大概'actorz.actorBeschrijving'。创建不同的数组,然后用'addObject:'按元素构建它,并始终检查'nil'。 – 2013-02-15 11:59:13