11

我有一组包含名称、地址和电话的对象。没有等

我希望能够在数组中搜索任何出现的术语 - 无论是在名称字段、地址字段等中。

我有这样的想法:

-(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]];
}

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

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

谓词代码现在是:

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, searchText, searchText];

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

三个是谓词搜索字段的限制吗?我该如何解决这个问题?再次感谢。

4

2 回答 2

17

只需使用一个谓词字符串来检查它们:

@"name contains[cd] %@ OR address contains[cd] %@"

您可以根据需要添加任意数量。

唯一的缺点是您需要为要测试的每个字段添加相同的搜索字符串,这看起来有点难看。

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

它是这样工作的:

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

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

请注意,这将不加选择地检查所有值,即使是那些您不想包含在字典中的值。

于 2013-09-16T08:05:17.700 回答
4

我认为您的数组项不是纯字符串,对吗?

假设您的数组项包含name属性(即使它是字典),您可以通过以下方式搜索它:

NSPredicate * predicate =
  [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", searchText, searchText];

在这里,name可以SELF.name


这是一份官方文件。

于 2013-09-16T08:04:17.333 回答