アプリで Finder の NSPredicateEditor ベースのメタデータ検索を複製しようとしています。
私は Finder の正確な NSPredicateEditor を無料で入手したいと思っていますが、その質問に対するより良い答えを誰かが持っていない限り、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)
私が見ている問題は、単一の「種類」のユーザー表示テキストに、選択された正しい値に基づいて結果の NSPredicate で使用される複数のキー パスが含まれていることです。
「種類」は、(少なくとも) kMDItemContentTypeTree
、_kMDItemGroupId
、またはを表すことができkMDItemKind
ます。
NSPredicateEditorRowTemplateを作成するとき、Left Expressions、Operators、Right Expressions の配列を渡します。次に、Left/Operator/Right のすべての可能な順列を含む行テンプレートが作成されます。
(注: Interface Builder ではなくプログラムでNSPredicateEditorRowTemplate
すべての sを作成しています)。
Finder は、3 つの左のキー パスと 12 の右の値のすべての可能な順列を作成していません。右側で選択された値に基づいて、特定の左側のキー パスを選択的に割り当てています。
ここにあるガイドに基づいて、NSRuleEditor
のプロパティを使用して行テンプレートをローカライズしています: http://funwithobjc.tumblr.com/post/1482915398/localizing-nspredicateeditorformattingDictionary
「Kind」の同じローカライズを、2 つの異なる の 2 つの異なるキー パス式に割り当てることができNSPredicateEditorRowTemplate
ます。
同じ左キー パス式を使用して "Kind" にローカライズされた 2 つの行テンプレートがある場合、次の "merge the templates" の引用は真であり、1 つの "Kind" のみがリストに表示されます。右側のポップアップは、2 つのテンプレートのすべての値の結合セットです。
実行時に、NSPredicateEditor はテンプレートをマージし、2 番目のポップアップに日付テンプレートのすべての演算子の結合が表示されます。http://www.cocoabuilder.com/archive/cocoa/282859-nspredicateeditorrowtemplate-and-dynamic-templateviews.html
ただし、両方とも「Kind」にローカライズされた 2 つの行テンプレートを作成し、異なる左キー パス式を使用すると、代わりに左式ポップアップに 2 つの「Kind」行が表示されます。テンプレートはマージされません。
Finder の動作を再現するにはどうすればよいですか? 異なるキー パス/式を表している場合でも、同じローカリゼーションを持っている場合は、左キー パスを何らかの方法でマージする必要があります。その結果、複数の左キー パスがそれぞれ独立した正しい値のセットを持つ単一の行テンプレートになります。