ios – 在NSArray上NSPredicate来搜索任何对象

前端之家收集整理的这篇文章主要介绍了ios – 在NSArray上NSPredicate来搜索任何对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个数组的名称,地址,电话的对象.诺斯等

我想能够搜索阵列中任何一个术语的出现 – 无论是在名称字段,地址字段等中.

我有这样的想法:

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
    // Update the filtered array based on the search text and scope.
    // Remove all objects from the filtered search array


    [self.searchResults removeAllObjects];
    // Filter the array using NSPredicate
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchText];
    searchResults = [NSMutableArray arrayWithArray:[contactArray filteredArrayUsingPredicate:predicate]];
}

这导致异常“不能在/包含运算符与集合中使用”.

UPDATE.我现在可以搜索最多三个字段.当我添加第四个(以任何顺序),我得到这个异常:“无法解析格式字符串…”

谓词代码现在是:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.narrative contains[c] %@ OR SELF.category contains[c] %@ OR SELF.date contains[c] OR SELF.name contains[c] %@",searchText,searchText];

     searchResults = [NSMutableArray arrayWithArray:[allDreams filteredArrayUsingPredicate:predicate]];

谓词搜索字段有三个限制吗?如何解决这个问题?再次感谢.

解决方法

只需使用一个谓词字符串来检查它们:
@"name contains[cd] %@ OR address contains[cd] %@"

您可以添加任意数量.

唯一的缺点是,您需要为要测试的每个字段添加相同的搜索字符串,这似乎有点丑陋.

如果您的对象是字典,那么有一种方法来真正搜索所有值,而不必在编译时使用子查询知道他们的名字.

它的工作原理如下:

@"subquery(self.@allValues,$av,$av contains %@).@count > 0"

它使用@allValues特殊键(或方法调用,如果您愿意)用于字典对象,并使用它来过滤包含搜索字符串的任何值.如果发现了任何一个(即计数为正),则该对象被包含在结果中.

请注意,这将会随意检查所有值,即使是您不希望包括的值,如果您的字典中有任何值.

猜你在找的iOS相关文章