3

根据前面的问题,我不情愿地放弃了使用 IB/Xcode4 来编辑 NSPredicateEditor 并纯粹在代码中完成。

在编辑字段的 GUI 方式中,可以使用空格指定键路径,例如“字段名称”,这使得它们可以作为“字段名称”样式的键路径,同时仍然使用空格在 UI 中显示它们。我如何在代码中做到这一点?当我用空格指定它们时,它们不起作用。当我在 camelCase 中指定它们时,它们可以工作但在 camelCase 中显示。我只是添加了一堆这样的 NSExpressions:

[NSExpression expressionForKeyPath:@"original filename"]
4

2 回答 2

3

在谓词编辑器的行视图中获取人类可读字符串的正确方法是使用 和 的本地化NSRuleEditor功能NSPredicateEditor

如果您按照此博客文章中的说明进行操作,您将拥有本地化编辑器所需的一切。

例如,假设您的关键路径是fileName,您支持 2 个运算符 (iscontains),并且您希望用户输入一个字符串。您最终会得到一个如下所示的字符串文件:

"%[fileName]@ %[is]@ %@" = "%1$[fileName]@ %2$[is]@ %3$@";
"%[fileName]@ %[contains]@ %@" = "%1$[fileName]@ %2$[contains]@ %3$@";

您可以使用此文件放入人类可读的内容,甚至重新排序:

"%[fileName]@ %[is]@ %@" = "%1$[original filename]@ %2$[is]@ %3$@";
"%[fileName]@ %[contains]@ %@" = "%3$@ %2$[is contained in]@ %1$[original filename]@";

本地化字符串文件后,将该文件交还给谓词编辑器,它会提取翻译后的值,发挥它的魔力,一切都会正确显示。

于 2011-10-01T06:16:54.897 回答
0

如果您不想本地化所有内容,只需映射考虑value(forKey:)在评估对象中覆盖的关键路径,如下所示:

class Match: NSObject {

    var date: Date?
    var fileName: String?

    override func value(forKey key: String) -> Any? {
        // Alternatively use static dictionary for mapping key paths
        super.value(forKey: camelCasedKeyPath(forKey: key))
    }

    private func camelCasedKeyPath(forKey key: String) -> String {
        key.components(separatedBy: .whitespaces)
            .enumerated()
            .map { $0.offset > 0 ? $0.element.capitalized : $0.element.lowercased() }
            .joined()
    }
}
于 2021-05-02T19:40:14.837 回答