如何在不同的数据上使用 NSPredicate 和 NSPredicateEditor(多个谓词?)

Posted

技术标签:

【中文标题】如何在不同的数据上使用 NSPredicate 和 NSPredicateEditor(多个谓词?)【英文标题】:How to use NSPredicate with NSPredicateEditor on different data (Multiple Predicates?) 【发布时间】:2012-07-07 01:21:17 【问题描述】:

我有一个文件路径数组,我的 UI 中有一个 NSPredicateEditor 设置,用户可以在其中组合一个 NSPredicate 来查找文件。他应该能够按名称、类型、大小和日期进行过滤

我现在有几个问题:

我只能从编辑器中获得一个谓词对象。当我使用 "predicateForRow:" 它返回 (null) 如果用户想按名称和大小或日期过滤文件,我 不能再在我的数组上使用这个谓词,因为那些 信息不包含在其中

我可以将一个谓词分成不同的谓词吗? 将其转换为 NSString 对象,然后搜索每个 @" OR " | @" AND " 并将组件分成一个数组,然后 将每个 NSString 转换为新的谓词?


在 NSPredicateEditor 设置中,我有一些“左表达式”选项: 键路径、常量值、字符串、整数、浮点数日期。我想用“名称”、“类型”、“日期”、“大小”向用户显示一个下拉菜单。但是生成的谓词自动看起来像这样:

"name" MATCHES[c] "nameTest" OR "type" MATCHES[c] "jpg" OR size == 100

因为数组中填充了字符串,搜索“name”、“type”等,而这些字符串不响应 @"myString"*.name*m,过滤器总是返回 0 个对象。有没有办法在菜单中显示名称、类型、大小和日期,但不手动将“self”写入谓词?

我已经在 Apple 官方教程、***、Google 甚至 Youtube 上搜索过,以找到线索。这个问题困扰了我将近一个星期。谢谢你的时间!如果您需要更多信息,请告诉我!

【问题讨论】:

【参考方案1】:

你来对地方了! :)

我只能从编辑器中获取一个谓词对象。

正确。它是NSPredicateEditor,而不是NSPredicatesEditor。 ;)

当我使用“predicateForRow:”时,它返回(null)

我不确定我会使用那种方法。我的一般经验法则是在很大程度上忽略NSPredicateEditorNSRuleEditor 的子类,主要是因为它是一个高度专业化的子类,以至于许多超类方法在谓词编辑器上没有多大意义(就像所有关于标准、行选择等的东西)。它们可能在某种程度上是相关的,但如果它们是相关的,我还没有弄清楚如何

要从编辑器中获取谓词,您可以:

NSPredicate *predicate = [myPredicateEditor objectValue];

如果用户想按名称和大小或日期过滤文件

你是说(name = [something]) AND (size = [something] OR date = [something])

如果是这样,如果您将嵌套模式设置为“复合”,NSPredicateEditor 可以做到这一点。

我不能再在我的数组上使用这个谓词,因为这些信息不包含在其中

您需要什么信息?

我是否可以将一个谓词拆分为不同的谓词而不将其转换为 NSString 对象,然后搜索每个 @" OR " | @" AND " 并将组件分离成一个数组,然后将每个 NSString 转换为一个新的谓词?

是的,但这是一个糟糕的想法。这很糟糕,因为 NSPredicate 已经包含您需要的所有信息,并且没有必要将其转换为不同的格式并进行 string 操作,并且可能会导致并发症(例如,如果有人可以输入“name”的值,如果他们输入“OR”会发生什么?)。

我很难弄清楚你想要做什么。听起来您有一个 NSString 对象数组,您想根据用户创建的谓词进行过滤?如果是这样,那么这些namedatesize 键路径是什么意思?你想做什么?

【讨论】:

嗨戴夫!非常感谢您的长篇回答和您提供的有用提示!我已经通过复合嵌套了谓词,问题如下:我的 dataController 拥有一个自定义对象数组。这些对象中的每一个都包含一个路径,我从中获取所有子路径以在那里搜索文件。所以我有一个子路径数组,我想搜索用户通过 Pred.Edit 选择的一个或多个不同的规范。但是这个 arrayOfSubpaths 不包含任何其他信息。要获得访问权限,我必须更改左侧的 expr。手动“自我”。我该怎么办? 为了更清楚一点:如果我的谓词只是过滤名称,那几乎没问题。我必须将“name”更改为“self”,然后它从 subPaths 数组中识别出正确的路径。但是如果用户想要按多个值排序,它们不包含在 subPaths 数组中,我将不得不使用新数据创建一个不同的数组并再次过滤。但随后谓词将找不到任何东西,因为名称不包含在数组中。我尽量避免“以防万一”创建具有 4 个属性的自定义对象。你现在明白我的问题了吗? @Tom 谓词在针对同质对象进行评估时效果最佳(即它们都是相同的时间)。我认为,如果您仅仅因为它只有 4 个属性而避免创建一个简单的模型对象,那可能是不明智的。 好,那我就做!如果我再遇到麻烦,我会再在这里问。感谢您的宝贵时间! @Tom 是的,你可以这样做。在本地化 NSPredicateEditor 中查看 the posts here。

以上是关于如何在不同的数据上使用 NSPredicate 和 NSPredicateEditor(多个谓词?)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?

如何在嵌套字典数组上使用 NSpredicate

如何在 iOS 的核心数据中创建和使用带有查询的 NSPredicate?

核心数据和 NSPredicate

如何使用 NSPredicate 从数组中选择确切的短语?

如何在核心数据中使用 NSPredicate 从属性之一获取值