6

我正在尝试UITableView's使用UISearchDisplayControllerand过滤数据NSCompoundPredicate。我有一个带有 3 的自定义单元格UILabels,我想在搜索中全部过滤,因此NSCompoundPredicate.

  // Filter the array using NSPredicate(s)

  NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"SELF.productName contains[c] %@", searchText];
  NSPredicate *predicateManufacturer = [NSPredicate predicateWithFormat:@"SELF.productManufacturer contains[c] %@", searchText];
  NSPredicate *predicateNumber = [NSPredicate predicateWithFormat:@"SELF.numberOfDocuments contains[c] %@",searchText];

  // Add the predicates to the NSArray

  NSArray *subPredicates = [[NSArray alloc] initWithObjects:predicateName, predicateManufacturer, predicateNumber, nil];

  NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

但是,当我这样做时,编译器会警告我:

使用“NSPredicate *”类型的表达式初始化“NSCompoundPredicate *_strong”的不兼容指针类型

我在网上看到的每个例子都做同样的事情,所以我很困惑。该NSCompoundPredicate orPredicateWithSubpredicates:方法采用(NSArray *)最后一个参数,所以我真的很困惑。

怎么了?

4

3 回答 3

13

首先,使用“contains”很慢,考虑一下“beginswith”?其次,你想要的是:

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

三,你可以这样做:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.productName beginswith[cd] %@ OR SELF.productManufacturer contains[cd] %@", searchText, searchText];
于 2012-11-30T14:45:22.757 回答
13

orPredicateWithSubpredicates:被定义为返回一个 NSPredicate*。您应该能够将最后一行代码更改为:

NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

...并且仍然应用了所有复合谓词。

于 2012-11-30T14:39:03.823 回答
0

这是我根据上面的答案创建的一个有用的方法(我非常感谢!)

它允许通过发送过滤器项数组和表示搜索条件的字符串来动态创建 NSPredicate。

在原来的情况下,搜索条件发生了变化,所以它应该是一个数组而不是一个字符串。但无论如何它可能会有所帮助

- (NSPredicate *)dynamicPredicate:(NSArray *)array withSearchCriteria:(NSString *)searchCriteria
{
    NSArray *subPredicates = [[NSArray alloc] init];
    NSMutableArray *subPredicatesAux = [[NSMutableArray alloc] init];
    NSPredicate *predicate;

    for( int i=0; i<array.count; i++ )
    {
        predicate = [NSPredicate predicateWithFormat:searchCriteria, array[i]];
        [subPredicatesAux addObject:predicate];
    }

    subPredicates = [subPredicatesAux copy];

    return [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
}
于 2015-08-28T20:32:46.993 回答