5

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

我更愿意免费获得 Finder 的确切 NSPredicateEditor,但除非有人对这个问题有更好的答案,否则我将不得不尽可能地复制 Finder 的搜索。

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

Finder 搜索中的每个 <code>Kind</code> 选项。

当我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时,我传递了一个左表达式、运算符和右表达式的数组。然后创建包含左/运算符/右的所有可能排列的行模板。

(注意:我以编程方式而不是在 Interface Builder 中NSPredicateEditorRowTemplate创建所有s )。

Finder并未创建 3 个左键路径和 12 个右值的所有可能排列。它是根据在右侧选择的值有选择地分配某个左键路径。

我正在使用NSRuleEditor'sformattingDictionary属性本地化行模板,基于此处找到的指南:http: //funwithobjc.tumblr.com/post/1482915398/localizing-nspredicateeditor

可以将相同的“Kind”本地化分配给两个不同NSPredicateEditorRowTemplate的 s 中的两个不同的键路径表达式。

当我使用相同的左键路径表达式将两个行模板本地化为“Kind”时,以下“合并模板”引用为真,并且列表中只显示一个“Kind”。右侧的弹出窗口是两个模板中所有值的联合集。

两行模板,单键路径,相同的本地化

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

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

两个行模板,两个关键路径,相同的本地化

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

4

1 回答 1

0

我的解决方案是拥有一个源属性,然后有多个重命名的 getter 来返回该属性。

每个kindImage-type getter 都是可以在谓词编辑器中独立定位的关键路径。

@objc lazy var kind: String = { return getKind() }()
@objc lazy var kindImage      = kind
@objc lazy var kindText       = kind
@objc lazy var kindDocument   = kind

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

于 2019-12-09T20:03:51.590 回答