NSCompoundPredicate

时间:2012-11-30 14:26:27

标签: objective-c uisearchbar uisearchdisplaycontroller nscompoundpredicate

我正在尝试使用UITableView'sUISearchDisplayController过滤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];

然而,当我这样做时,编译器警告我:

  

初始化'NSCompoundPredicate * _strong'的指针类型不兼容   表达式为'NSPredicate *'

我在网上看到的每个例子都是完全相同的,所以我很困惑。 NSCompoundPredicate orPredicateWithSubpredicates:方法在最后一个参数中使用(NSArray *),所以我真的很困惑。

怎么了?

3 个答案:

答案 0 :(得分:13)

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

NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

...并且仍然应用了所有复合预测。

答案 1 :(得分:12)

首先,使用“包含”非常慢,考虑到mayber“从头开始”? 其次,你想要的是:

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

三,你可能只是做了类似的事情:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.productName beginswith[cd] %@ OR SELF.productManufacturer contains[cd] %@", searchText, searchText];

答案 2 :(得分: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];
}