如何在不同的数据上使用NSPredicate和NSPredicateEditor(Multiple Predicates?)

时间:2012-07-07 01:21:17

标签: arrays macos nspredicate nspredicateeditor

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

我现在有几个问题:

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

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


在NSPredicateEditor设置中,我有一些“左表达式”的选项: 键区,常量值,字符串,整数,浮点数日期。我想用“name”,“type”,“date”,“size”向用户显示一个下拉菜单。但是生成的谓词会自动显示如下:

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

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

我已经在Apple官方教程,Stackoverflow,Google甚至Youtube上搜索了一些线索。这个问题困扰了我差不多一个星期了。谢谢你的时间!如果您需要更多信息,请告诉我们!

1 个答案:

答案 0 :(得分:3)

你来对了地方! :)

  

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

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

  

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

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

要从编辑器获取谓词,请执行以下操作:

NSPredicate *predicate = [myPredicateEditor objectValue];
  

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

你的意思是(name = [something]) AND (size = [something] OR date = [something])

如果是这样,如果您将嵌套模式设置为“复合”,则NSPredicateEditor可以执行此操作。

  

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

您需要哪些信息?

  

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

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

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