【发布时间】:2017-01-10 18:12:17
【问题描述】:
我正在尝试在应用中复制 Finder 的基于 NSPredicateEditor 的元数据搜索。
I'd prefer to get the Finder's exact NSPredicateEditor for free,但除非有人对这个问题有更好的答案,否则我将不得不尽可能地复制 Finder 的搜索。
在处理Kind 选项的镜像时,我遇到了一个问题。我首先保存 Finder Spotlight 搜索,其中包含所有可用的 Kind 选项。
当我在结果保存的搜索文件夹上Get Info 时,查询被列为:
(kMDItemContentTypeTree=com.apple.application) &&
(kMDItemContentTypeTree=public.archive) &&
(kMDItemContentTypeTree = public.content) &&
(_kMDItemGroupId = 8) &&
(_kMDItemGroupId = 9) &&
(_kMDItemGroupId = 13) &&
(_kMDItemGroupId = 7) &&
(_kMDItemGroupId = 10) &&
(_kMDItemGroupId = 11) &&
(_kMDItemGroupId = 12) &&
(kMDItemContentTypeTree = public.text) &&
(kMDItemKind = "my_Kind_custom_text*"cdw)
我看到的问题是,单个“Kind”用户显示的文本包含多个键路径,这些路径根据选择的正确值在生成的 NSPredicate 中使用。
“种类”可以代表(至少)kMDItemContentTypeTree、_kMDItemGroupId 或 kMDItemKind。
当我创建一个NSPredicateEditorRowTemplate 时,我传递了一个左表达式、运算符和右表达式的数组。然后创建包含左/运算符/右的所有可能排列的行模板。
(注意:我正在创建所有 NSPredicateEditorRowTemplates programatically rather than in Interface Builder)。
Finder 没有创建 3 个左键路径和 12 个右值的所有可能排列。它是根据右侧选择的值选择性地分配某个左键路径。
我正在使用NSRuleEditor 的formattingDictionary 属性本地化行模板,基于此处找到的指南:http://funwithobjc.tumblr.com/post/1482915398/localizing-nspredicateeditor
我可以将相同的“Kind”本地化分配给两个不同NSPredicateEditorRowTemplates 中的两个不同键路径表达式。
当我使用 same 左键路径表达式将两个行模板本地化为“Kind”时,以下“合并模板”引用为真,列表中只显示一个“Kind” .右侧的弹出窗口是两个模板中所有值的联合集。
在运行时,NSPredicateEditor 会将模板合并在一起,第二个弹出窗口将显示日期模板的所有运算符的联合。 http://www.cocoabuilder.com/archive/cocoa/282859-nspredicateeditorrowtemplate-and-dynamic-templateviews.html
但是,当我使用 不同 左键路径表达式创建两个本地化为“Kind”的行模板时,我在左侧表达式弹出窗口中获得了两个“Kind”行。模板未合并。
我应该如何复制 Finder 的行为?如果左键路径具有相同的本地化,我需要以某种方式合并它们即使它们代表不同的键路径/表达式,从而产生具有多个左键路径的单行模板,每个左键路径具有独立的右值集.
【问题讨论】:
-
我会挖掘一下,但我的直觉告诉我你需要一个自定义的
NSPredicateEditorRowTemplate子类。 -
Finder 使用
NSRuleEditor。 -
如果所有键路径都相同,是否可以将任何弹出窗口和文本字段放在可合并的行模板中?
-
@Willeke 如果关键路径与我的
Name | Kind屏幕截图中的行相同(如果您的意思是这样的话)。 -
如果第一种有两个弹出按钮,如“图像”,第二种有一个文本字段,如“其他”,它们是否合并?
标签: cocoa nspredicate appkit nspredicateeditor nspredicateeditorrow