6

テンプレートが次の方法で生成された述語エディターがあります。

    NSArray * test = [NSArray arrayWithObjects:
                      [NSExpression expressionForKeyPath: @"Abc"],
                      [NSExpression expressionForKeyPath: @"Def"],
                      nil];


    NSPredicateEditorRowTemplate * template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions: test
                                   rightExpressionAttributeType: NSStringAttributeType
                                                       modifier: NSDirectPredicateModifier
                                                      operators: [NSArray arrayWithObject:
                                                                 [NSNumber numberWithUnsignedInteger:NSContainsPredicateOperatorType]]
                                                        options:(NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption)];

したがって、述語エディターを次のように入力すると、次のようになります。 述語エディター

生成された述語をログアウトすると、次のようになります。

Abc CONTAINS[cd] "abc" OR Def CONTAINS[cd] "def"

私が疑問に思っているのは、述語エディターのテンプレート表示を、生成された述語に設定された値とは異なるものにすることができるかどうかということです。

例: 出力述語に次のものが必要です。

Field1 CONTAINS[cd] "abc" OR Field2 CONTAINS[cd] "def"

エディターは引き続きフィールドとしてabcとを表示defしますが。これは可能ですか?

4

4 に答える 4

11

はい、できます。

左の式の配列を最後の述語の実際のキーパスにする必要があります。あなたの場合、"Field1"そして"Field2"

ポップアップに別の値を表示することに関しては、ここで驚くべき概念が登場します。

述語エディターを English にローカライズします

これを行うには 2 つの方法があります。

  1. .strings ファイルを使用
  2. NSDictionary

.strings ファイルを使用

ソースでは、コメントに次の内容を含めます。

// NSLocalizedStringFromTable(@"%[Field1,Field2]@ %[contains]@ %@", @"PredicateEditor", @"")

genstringsソース コードで実行するPredicateEditor.stringsと、次のエントリを含むファイルが生成されます。

"%[Field1]@ %[contains]@ %@" = "%[Field1]@ %[contains]@ %@";
"%[Field2]@ %[contains]@ %@" = "%[Field2]@ %[contains]@ %@";

値を次のように変更します。

"%[Field1]@ %[contains]@ %@" = "%[Abc]@ %[contains]@ %@";
"%[Field2]@ %[contains]@ %@" = "%[Def]@ %[contains]@ %@";

次に、 を作成するときにプロパティをにNSPredicateEditor設定すると、残りはエディターが処理します。formattingStringsFileName"PredicateEditor"

NSDictionary

これは、基本的に行うことを除いて、.strings オプションと同じ基本概念に従います。

NSDictionary *formatting = @{
  @"%[Field1]@ %[contains]@ %@" : @"%[Abc]@ %[contains]@ %@",
  @"%[Field2]@ %[contains]@ %@" : @"%[Def]@ %[contains]@ %@"
}
[myPredicateEditor setFormattingDictionary:formatting];

それはあなたがしなければならないすべてです。

これについてはかなり前にブログに書きましたが、役立つ情報がたくさんあります。

于 2012-12-07T05:12:05.843 に答える
1

基本的に、ポップアップ ボタンのメニュー項目のタイトルを変更します。それはあなたがする必要があるすべてです。返される基になる述語に影響を与えるべきではありません。インターフェイス ビルダーで作成した場合は、テンプレートのメニュー項目にアクセスしてタイトルを設定するのは簡単です。ただし、コードでこれを行ったので、コードで修正する必要があります。

これを行う方法は次のとおりです。行テンプレート クラスで、NSTextField の幅を変更したいと考えていました。だから私の行テンプレートクラスで私はそれらを探して、このように変更します...

- (void)awakeFromNib {
    NSArray* views = [self templateViews];
    for (id view in views) {
        if ([[view class] isEqual:[NSTextField class]]) {
            NSRect tfFrame = [view frame];
            tfFrame.size.width = 600;
            [view setFrame:tfFrame];
        }
    }
}

templateViews を取得して NSTextFields を探し、それらを変更していることがわかります。NSPopupButtons を探して同様のことを行うことができます。見つけたら、メニュー項目のタイトルを確認し、「abc」と「def」というタイトルのものを探し、タイトルをそれぞれ「Field1」と「Field2」に変更します。

于 2012-12-07T00:45:44.840 に答える
0

NSLocalizedString特定の形式でオプション リテラルを使用しgenstringsてローカライズ文字列を生成するよりも、最終的なローカライズ .strings ファイル文字列を自分で生成する方が簡単でクリーンなようです。

このブログ投稿から、プライベート API を使用して_generateFormattingDictionaryStringsFile、NSPredicateEditor 自体からフォーマット文字列を取得できます。

extension NSPredicateEditor {

    func formattingDictionaryStrings() -> String? {
        var strings: String? = nil

        if let formattingDictionaryData = self.perform(Selector("_generateFormattingDictionaryStringsFile"))?.takeRetainedValue() as? Data {
            strings = String(data: formattingDictionaryData, encoding: .utf16)
        }

        return strings
    }

}

これにより、 の必要性をスキップして、すべての順列が生成されgenstringsます。次に、 の右側にあるトークンを、=ユーザーが表示する文字列に置き換えます。

"%[ABC]@ %[is]@ %[123]@" = "%1$[ABC]@ %2$[is]@ %3$[123]@";
"%[ABC]@ %[is]@ %[456]@" = "%1$[ABC]@ %2$[is]@ %3$[456]@";
"%[ABC]@ %[is]@ %[789]@" = "%1$[ABC]@ %2$[is]@ %3$[789]@";
"%[ABC]@ %[contains]@ %[123]@" = "%1$[ABC]@ %2$[contains]@ %3$[123]@";
"%[ABC]@ %[contains]@ %[456]@" = "%1$[ABC]@ %2$[contains]@ %3$[456]@";
"%[ABC]@ %[contains]@ %[789]@" = "%1$[ABC]@ %2$[contains]@ %3$[789]@";

さらに良いことNSPredicateEditorRowTemplateに、述語で内部的に使用されるキーパスとそのオプションのローカライズされた文字列の両方を入力として受け取るように、それぞれをビルドするコードを作成できます。

その後、メソッドは上記の文字列を生成できますが、正しいローカライズが既に挿入されています。

注: この_generateFormattingDictionaryStringsFileプライベート API メソッドを呼び出すと、NSPredicateEditor 内でランダムなクラッシュが発生するようです:

このクラスは、 key のキー値コーディングに準拠していませんrowType

したがって、必要に応じて一度実行してください。ただし、通常のアプリの実行中またはテスト中は、アクティブなままにしないでください。

于 2017-01-08T05:36:53.983 に答える