gpt4 book ai didi

ios - 使用 NSPredicates 过滤 NSMutableArray

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:11 26 4
gpt4 key购买 nike

我已经在 StackOverflow 上查看了 NSPredicates 上的一些主题,虽然它们都指向正确的方向,但我一定遗漏了一些重要的东西。

我有一个包含产品列表的 NSMutableArray。每个产品都有多个属性,例如品牌、类别和类型。

现在我希望我的用户能够使用 NSPredicates 过滤那个 NSMutableArray,以至于如果任何选定的过滤器是空白的,它不应该使用那个过滤器。

但是,反过来,例如,如果所有过滤器都打开:使用具有类别 B 和类型 C 的品牌 A 过滤器,它应该只显示具有类别 B 和类型 C 的品牌 A。

然后我应该取消选择类别 B,它会筛选出类型 C 的品牌 A。

我已经写了一些代码,但它主要返回一个空的 NSMutableArray,所以我猜我的 NSPredicates 已经关闭了。

我还发现我需要在运行谓词之前默认为“所有产品”NSMutableArray,否则它会在选择新的过滤器选项时过滤已经过滤的数组。我应该将多个数组与一些 BOOLean magick 一起使用,还是可以使用 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];
}

最佳答案

您的代码中存在一些概念性错误。

首先,您应该在声明时初始化谓词的 NSMutableArray:

NSMutableArray *compoundPredicateArray = [NSMutableArray array];

现在你只在你的第一个 if() 中实例化它,所以如果没有设置品牌过滤器,可变数组甚至不会被实例化,所以稍后向它添加对象(例如在第二次过滤中 if()) 无效,复合谓词创建为空。在您的第一个 if() 中,您将拥有:

[compoundPredicateArray addObject:brandPredicate];

您的第二个问题是,正如您正确想象的那样,当您使用 filterUsingPredicate 时,您正在过滤之前已经过滤过的内容。

你应该做的是始终将未过滤的数据保存在 NSArray 中,并对其使用 filteredArrayUsingPredicate 方法来检索新的过滤后的 NSArray 你将用来显示来自的数据。

关于ios - 使用 NSPredicates 过滤 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15107695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com