我已经检查了 StackOverflow 中关于 NSPredicates 的一些主题,尽管它们都指向正确的方向,但我一定遗漏了一些重要的东西。
我有一个包含产品列表的 NSMutableArray。每个产品都有几个属性,如品牌、类别和类型。
现在我希望我的用户能够使用 NSPredicates 过滤该 NSMutableArray,因为如果任何选定的过滤器为空,则不应使用该过滤器。
但是,反过来,例如,如果所有过滤器都打开:过滤器品牌 A,类别 B 和类型 C,它应该只显示品牌 A,类别 B 和类型 C。
如果我随后取消选择 Cat B,它将使用 C 类过滤品牌 A。
我写了一些代码,但它主要返回一个空的 NSMutableArray,所以我猜我的 NSPredicates 是关闭的。
我还发现在运行谓词之前我需要默认为“所有产品”NSMutableArray,否则在选择新的过滤器选项时它会过滤已经过滤的数组。我应该使用带有一些布尔魔法的多个数组,还是可以使用 NSPredicates 解决这个问题?
这是我的代码:
-(void)filterTable
{
NSPredicate *brandPredicate;
NSPredicate *categoryPredicate;
NSMutableArray *compoundPredicateArray;
if( ![self.selectedBrand isEqual: @"Show All Brands"] || !(self.currentBrand == NULL))
{
brandPredicate = [NSPredicate predicateWithFormat:@"brand CONTAINS[cd] %@",self.currentBrand];
compoundPredicateArray = [ NSMutableArray arrayWithObject: brandPredicate ];
}
if( ![self.currentCategory isEqual: @"Show All Categories"] || !(self.currentCategory == NULL))
{
categoryPredicate = [NSPredicate predicateWithFormat:@"category CONTAINS[cd] %@",self.currentCategory];
[ compoundPredicateArray addObject: categoryPredicate];
}
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:
compoundPredicateArray ];
[self.tableData filterUsingPredicate:predicate];
[self.popNTwinBee dismissPopoverAnimated:YES]; // PopoverController
[self.tableView reloadData];
}