如何在不同的数据上使用 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)
我不确定我会使用那种方法。我的一般经验法则是在很大程度上忽略NSPredicateEditor
是NSRuleEditor
的子类,主要是因为它是一个高度专业化的子类,以至于许多超类方法在谓词编辑器上没有多大意义(就像所有关于标准、行选择等的东西)。它们可能在某种程度上是相关的,但如果它们是相关的,我还没有弄清楚如何。
要从编辑器中获取谓词,您可以:
NSPredicate *predicate = [myPredicateEditor objectValue];
如果用户想按名称和大小或日期过滤文件
你是说(name = [something]) AND (size = [something] OR date = [something])
?
如果是这样,如果您将嵌套模式设置为“复合”,NSPredicateEditor
可以做到这一点。
我不能再在我的数组上使用这个谓词,因为这些信息不包含在其中
您需要什么信息?
我是否可以将一个谓词拆分为不同的谓词而不将其转换为 NSString 对象,然后搜索每个 @" OR " | @" AND " 并将组件分离成一个数组,然后将每个 NSString 转换为一个新的谓词?
是的,但这是一个糟糕的想法。这很糟糕,因为 NSPredicate
已经包含您需要的所有信息,并且没有必要将其转换为不同的格式并进行 string 操作,并且可能会导致并发症(例如,如果有人可以输入“name”的值,如果他们输入“OR”会发生什么?)。
我很难弄清楚你想要做什么。听起来您有一个 NSString
对象数组,您想根据用户创建的谓词进行过滤?如果是这样,那么这些name
、date
和size
键路径是什么意思?你想做什么?
【讨论】:
嗨戴夫!非常感谢您的长篇回答和您提供的有用提示!我已经通过复合嵌套了谓词,问题如下:我的 dataController 拥有一个自定义对象数组。这些对象中的每一个都包含一个路径,我从中获取所有子路径以在那里搜索文件。所以我有一个子路径数组,我想搜索用户通过 Pred.Edit 选择的一个或多个不同的规范。但是这个 arrayOfSubpaths 不包含任何其他信息。要获得访问权限,我必须更改左侧的 expr。手动“自我”。我该怎么办? 为了更清楚一点:如果我的谓词只是过滤名称,那几乎没问题。我必须将“name”更改为“self”,然后它从 subPaths 数组中识别出正确的路径。但是如果用户想要按多个值排序,它们不包含在 subPaths 数组中,我将不得不使用新数据创建一个不同的数组并再次过滤。但随后谓词将找不到任何东西,因为名称不包含在数组中。我尽量避免“以防万一”创建具有 4 个属性的自定义对象。你现在明白我的问题了吗? @Tom 谓词在针对同质对象进行评估时效果最佳(即它们都是相同的时间)。我认为,如果您仅仅因为它只有 4 个属性而避免创建一个简单的模型对象,那可能是不明智的。 好,那我就做!如果我再遇到麻烦,我会再在这里问。感谢您的宝贵时间! @Tom 是的,你可以这样做。在本地化 NSPredicateEditor 中查看 the posts here。以上是关于如何在不同的数据上使用 NSPredicate 和 NSPredicateEditor(多个谓词?)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?