我有一个数组的名称,地址,电话的对象.诺斯等
我想能够搜索阵列中任何一个术语的出现 – 无论是在名称字段,地址字段等中.
我有这样的想法:
-(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特殊键(或方法调用,如果您愿意)用于字典对象,并使用它来过滤包含搜索字符串的任何值.如果发现了任何一个(即计数为正),则该对象被包含在结果中.
请注意,这将会随意检查所有值,即使是您不希望包括的值,如果您的字典中有任何值.