使用谓词在结果中搜索

Posted

技术标签:

【中文标题】使用谓词在结果中搜索【英文标题】:Using predicates to search within results 【发布时间】:2015-01-06 19:48:52 【问题描述】:

我创建了一个汽车的核心数据模型,我想选择一种车辆类型加上几种不同颜色中的任何一种,这是我的设想:

选择视图控制器

1) 选择汽车类型(轿车、轿跑车、SUV、混合动力车)(我设想使用分段控件将其设置为谓词)

2) 选择车辆类型后,我希望从颜色列表中选择仅显示满足我在第一步中选择的车辆类型的车辆。例如,我想只显示(红色、绿色和蓝色)的 SUV 或只显示黑色和白色的混合动力车。

结果 TableViewController

3) 一旦选择了这些,我想将它们转储到另一个 TVC 上。

这篇文章有点帮助,但提出问题的人试图找到不同的项目(例如:A、B 和 C)。我试图仅在 A 中找到 X、Y 和 Z。 Can I apply multiple predicates to an NSFetchRequest? Would it be better to manually parse my results?

当我尝试检索一种类型的车辆以及所选颜色的列表时遇到了麻烦

let vehiclePredicate = NSPredicate(format: "type == %@", "(one of sedan/coupe/SUV/hybrid)")

并且满足以下任一条件

let colorRedPredicate = NSPredicate(format: "color == %@", "red")
let colorGreenPredicate = NSPredicate(format: "color == %@", "green")
let colorBluePredicate = NSPredicate(format: "color == %@", "red")
let colorBlackPredicate = NSPredicate(format: "color == %@", "black")
let colorWhitePredicate = NSPredicate(format: "color == %@", "white")

let colorPredicates: NSArray = [**add colors here when they're selected**]

我正在尝试找出最简洁的方法来执行此操作,但我发现的示例仅检索不同的项目。

我遇到的另一个障碍是如何将结果从我的 SelectionVC 获取到 ResultsTVC。我知道我需要一个代表,但我需要什么?对此的任何帮助将不胜感激。

【问题讨论】:

您的意思是对颜色进行“与”还是“对”? vehicleType AND [colorPredicates] 示例:混合动力 AND [白色]、轿车 AND [红色 AND 蓝色] 【参考方案1】:

您希望得到如下谓词:

type == %@ AND color IN %@

然后将您的类型作为字符串提供,并将颜色作为集合提供。您可以使用从其他 2 个创建的复合谓词来执行此操作,或者只需更改您的 UI 选择的含义并生成两个参数作为段名称和颜色数组。

如果您想组合双簧管的多个选项,则需要创建每个选项,然后使用复合谓词来组合它们。

【讨论】:

谢谢!使用我上面的内容,对于我们这些咬牙切齿的人来说,完整的谓词会是什么样子? 好吧,我不明白你的轿车和红色和蓝色是如何工作的,我希望你想要或颜色,然后我展示的格式是你唯一需要的格式,还有一个如果您想要多种类型+颜色选择,则复合谓词。【参考方案2】:

你的问题不清楚。您的谓词语法错误 - 难以理解。话虽如此,我想我猜你想要什么,所以就在这里。

您可以从没有任何过滤器的完全加载的表格视图开始。您可以实现过滤器菜单(或按钮)并以模态方式呈现适当的控件(分段控件、具有多选的表格视图、具有单选的表格视图、滑块等)。

在您的原始表格视图中,您使用NSFetchedResultsController,并保留NSPredicate 作为属性。每当谓词更改时,您nil 退出获取的结果控制器并重新加载您的表。

模态控制视图可以反馈给您的主视图控制器,然后它会修改谓词。您可以将所有谓词与NSCompoundPredicate API 结合使用。也许将它们保存在一个可变数组中是最方便的,因此您可以方便地使用它们。

var predicateArray = [NSPredicate]()

例如从这个开始

predicate = NSPredicate(value: "true")
predicateArray.append(predicate)

现在颜色控制器发回["red", "green", "blue"]。您可以通过构造正确的谓词字符串或使用orPredicateWithSubpredicates 来构造或谓词,但仅使用集合运算符可能更容易:

let colorPredicate = NSPredicate(format: "color in %@", colorStrings)!
predicateArray.append(colorPredicate)

在您获取的结果控制器 getter 中,您根据谓词数组重构谓词:

fetchRequest.predicate = 
   NSCompoundPredicate.andPredicateWithSubpredicates(predicateArray)

【讨论】:

以上是关于使用谓词在结果中搜索的主要内容,如果未能解决你的问题,请参考以下文章

iOS 简单数组谓词

CloudKit 谓词:使用 CKQuery 的谓词搜索多个参考字段

核心数据 - 使用谓词更好地搜索

iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回

如何使用谓词在 NSMutableArray 上搜索某些内容

一天的谓词格式,用于搜索从 HealthKit 检索的 Steps Sample Array