NSCompoundPredicate
Posted
技术标签:
【中文标题】NSCompoundPredicate【英文标题】: 【发布时间】:2012-11-30 14:26:27 【问题描述】:我正在尝试使用UISearchDisplayController
和 过滤
UITableView's
数据。我有一个自定义单元格,其中包含 3 个 UILabels
,我希望在搜索中全部过滤,因此是 。
// 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];
*compoundPredicate = [ orPredicateWithSubpredicates:subPredicates];
但是,当我这样做时,编译器会警告我:
初始化 ' *_strong' 的指针类型不兼容 带有“NSPredicate *”类型的表达式
我在网上看到的每个例子都做同样的事情,所以我很困惑。 orPredicateWithSubpredicates:
方法在最后一个参数中采用 (NSArray *)
,所以我真的很困惑。
怎么了?
【问题讨论】:
【参考方案1】:首先,使用“contains”很慢,考虑一下可能是“beginswith”? 二、你想要的是:
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
三,你可以这样做:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.productName beginswith[cd] %@ OR SELF.productManufacturer contains[cd] %@", searchText, searchText];
【讨论】:
我早些时候尝试过这样做,但遇到了崩溃 - 我想这是不睡觉连续工作约 15 个小时的成本:)【参考方案2】:orPredicateWithSubpredicates:
被定义为返回一个 NSPredicate*。您应该能够将最后一行代码更改为:
NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
...并且仍然应用了所有复合谓词。
【讨论】:
【参考方案3】:这是我根据上面的答案创建的一个有用的方法(非常感谢!)
它允许动态地创建一个 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];
【讨论】:
以上是关于NSCompoundPredicate的主要内容,如果未能解决你的问题,请参考以下文章