我正在尝试在应用中复制Finder基于NSPredicateEditor的元数据搜索。
I'd prefer to get the Finder's exact NSPredicateEditor for free,但除非有人对这个问题有更好的答案,否则看起来我必须尽可能地复制Finder的搜索。
在镜像Kind
选项时,我遇到了问题。我首先使用所有可用的Kind
选项保存Finder Spotlight搜索。
当我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时,我传递一个左表达式,运算符和右表达式数组。然后创建行模板,其中包含左侧/操作员/右侧的所有可能的排列。
(注意:我正在创建所有NSPredicateEditorRowTemplate
s programatically rather than in Interface Builder)。
Finder 不创建3个左键路径和12个右键值的所有可能排列。它根据右侧选择的值有选择地分配某个左键路径。
我正在使用NSRuleEditor
的{{1}}属性对行模板进行本地化,具体取决于此处的指南:http://funwithobjc.tumblr.com/post/1482915398/localizing-nspredicateeditor
我可以将“Kind”的相同本地化分配给两个不同的formattingDictionary
s中的两个不同的关键路径表达式。
当我使用相同左键路径表达式将两个行模板本地化为“Kind”时,以下“合并模板”引用为true且列表中只显示一个“Kind” 。右侧弹出窗口是两个模板中所有vaule的联合集。
在运行时,NSPredicateEditor会将模板合并在一起,第二个弹出窗口将显示日期模板的所有运算符的并集。 http://www.cocoabuilder.com/archive/cocoa/282859-nspredicateeditorrowtemplate-and-dynamic-templateviews.html
但是,当我使用不同的左键路径表达式创建两个本地化为“Kind”的行模板时,我会在左侧表达式弹出窗口中获得两个“Kind”行。模板未合并。
我应该如何复制Finder的行为?我需要以某种方式合并左键路径,如果它们具有相同的本地化,即使它们代表不同的键路径/表达式,从而产生具有多个左键路径的单行模板,每个路径具有独立的右值组。
答案 0 :(得分:0)
我的解决方案是拥有一个源属性,然后具有多个重命名的getter来返回该属性。
每个kindImage
型getter是可以在谓词编辑器中独立定位的关键路径。
@objc lazy var kind: String = { return getKind() }()
@objc lazy var kindImage = kind
@objc lazy var kindText = kind
@objc lazy var kindDocument = kind
尽管返回相同的值,但谓词编辑器行不会合并,因为它们使用的键路径不同。