NSPredicateEditor和NSExpression - 显示是否可以与谓词的值不同?

Kyl*_*yle 6 cocoa objective-c nspredicateeditor nspredicate nsexpression

我有一个谓词编辑器,模板是通过以下方式生成的:

    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)];
Run Code Online (Sandbox Code Playgroud)

所以,如果我填写这样的谓词编辑器: 谓词编辑器

当我注销生成的谓词时,我得到:

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

我想知道的是,如果我能以某种方式让谓词编辑器模板显示与生成的谓词中设置的值不同.

EX:我希望输出谓词具有:

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

即使编辑器仍然显示abcdef作为字段.这可能吗?

Dav*_*ong 10

是的,你可以这样做.

您希望左表达式数组是最终谓词中的实际keyPath.在你的情况下,"Field1""Field2".

至于在弹出窗口中显示不同的值,这里是一个令人费解的概念:

您将要将谓词编辑器本地化为英语.

有两种方法可以做到这一点.

  1. 使用.strings文件
  2. NSDictionary

使用.strings文件

在您的来源中,您将在评论中包含以下内容:

// NSLocalizedStringFromTable(@"%[Field1,Field2]@ %[contains]@ %@", @"PredicateEditor", @"")
Run Code Online (Sandbox Code Playgroud)

当您运行genstrings源代码时,这将生成一个PredicateEditor.strings包含以下条目的文件:

"%[Field1]@ %[contains]@ %@" = "%[Field1]@ %[contains]@ %@";
"%[Field2]@ %[contains]@ %@" = "%[Field2]@ %[contains]@ %@";
Run Code Online (Sandbox Code Playgroud)

您可以将值更改为:

"%[Field1]@ %[contains]@ %@" = "%[Abc]@ %[contains]@ %@";
"%[Field2]@ %[contains]@ %@" = "%[Def]@ %[contains]@ %@";
Run Code Online (Sandbox Code Playgroud)

然后,当您创建自己时NSPredicateEditor,您将formattingStringsFileName属性设置为"PredicateEditor",编辑器将负责其余的工作.

NSDictionary

这将遵循与.strings选项相同的基本概念,除了您基本上会这样做:

NSDictionary *formatting = @{
  @"%[Field1]@ %[contains]@ %@" : @"%[Abc]@ %[contains]@ %@",
  @"%[Field2]@ %[contains]@ %@" : @"%[Def]@ %[contains]@ %@"
}
[myPredicateEditor setFormattingDictionary:formatting];
Run Code Online (Sandbox Code Playgroud)

这就是你要做的一切.

我很久以前在博客上写过这篇文章,而且有更多的信息可能会对您有所帮助.