在同一个NSPredicateEditorRowTemplate中合并多个本地化左键路径?

时间:2017-01-10 18:12:18

标签: cocoa nspredicate appkit nspredicateeditor nspredicateeditorrow

我正在尝试在应用中复制Finder基于NSPredicateEditor的元数据搜索。

I'd prefer to get the Finder's exact NSPredicateEditor for free,但除非有人对这个问题有更好的答案,否则看起来我必须尽可能地复制Finder的搜索。

在镜像Kind选项时,我遇到了问题。我首先使用所有可用的Kind选项保存Finder Spotlight搜索。

Every <code>Kind</code> option in Finder search.

当我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_kMDItemGroupIdkMDItemKind

当我创建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的联合集。

two row templates, single key path, same localization

  

在运行时,NSPredicateEditor会将模板合并在一起,第二个弹出窗口将显示日期模板的所有运算符的并集。 http://www.cocoabuilder.com/archive/cocoa/282859-nspredicateeditorrowtemplate-and-dynamic-templateviews.html

但是,当我使用不同的左键路径表达式创建两个本地化为“Kind”的行模板时,我会在左侧表达式弹出窗口中获得两个“Kind”行。模板未合并。

two row templates, two key paths, same localization

我应该如何复制Finder的行为?我需要以某种方式合并左键路径,如果它们具有相同的本地化,即使它们代表不同的键路径/表达式,从而产生具有多个左键路径的单行模板,每个路径具有独立的右值组。

1 个答案:

答案 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

尽管返回相同的值,但谓词编辑器行不会合并,因为它们使用的键路径不同。