我正在尝试在应用程序中复制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)
我看到的问题是,单个“种类”用户显示的文本包含多个键路径,这些键路径基于所选择的正确值在生成的NSPredicate中使用。
“种类”可以(至少)表示
kMDItemContentTypeTree
,_kMDItemGroupId
或kMDItemKind
。创建NSPredicateEditorRowTemplate时,我传递了一个Left表达式,运算符和Right表达式的数组。然后创建行模板,其中包含left/operator/Right的所有可能的排列。
(注意:我正在创建所有
NSPredicateEditorRowTemplate
的programatically rather than in Interface Builder)。Finder是而不是,它创建3个Left键路径和12个Right值的所有可能排列。它基于在右侧选择的值有选择地分配某个左键路径。
我正在根据此处找到的指南使用
NSRuleEditor
的formattingDictionary
属性本地化行模板。我可以为两个不同的
NSPredicateEditorRowTemplate
中的两个不同的键路径表达式分配相同的“种类”本地化。当我有两个行模板使用相同的左键路径表达式本地化为“种类”时,以下“合并模板”引号为true,并且列表中仅显示一个“种类”。右边的弹出窗口是两个模板中所有值的并集。
http://funwithobjc.tumblr.com/post/1482915398/localizing-nspredicateeditor
但是,当我使用不同的左键路径表达式创建两个都定位为“Kind”的行模板时,我在左表达式弹出窗口中获得了两个“Kind”行。模板未合并。
我应该如何复制Finder的行为?我需要以某种方式合并左键路径(即使它们表示不同的键路径/表达式),即使它们具有相同的本地化,从而导致具有多个左键路径的行模板具有各自独立的右值集。
最佳答案
我的解决方案是只有一个源属性,然后有多个重命名的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
尽管返回相同的值,但谓词编辑器行将不会合并,因为它们使用的是不同的键路径。
关于cocoa - 在同一NSPredicateEditorRowTemplate中合并多个本地化的左键路径?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41575563/