根据上一个问题,我不情愿地放弃使用IB / Xcode4来编辑NSPredicateEditor并完全在代码中完成。
在GUI中编辑字段的方式,可以使用空格指定键路径,例如“字段名称”,它使它们作为“fieldName”样式的键路径工作,同时仍然在带有空格的UI中显示它们。我如何在代码中执行此操作?当我用空格指定它们时,它们不起作用。当我在camelCase中指定它们时,它们可以工作但显示在camelCase中。我只是添加了一堆像这样的NSExpressions:
[NSExpression expressionForKeyPath:@"original filename"]
答案 0 :(得分:3)
在谓词编辑器的行视图中获取人类可读字符串的正确方法是使用NSRuleEditor
和NSPredicateEditor
的本地化功能。
如果您按照this blog post中的说明操作,您将拥有本地化编辑器所需的一切。
例如,假设您的密钥路径为fileName
,您支持2个运营商(is
和contains
),并且您希望用户输入字符串。你最终会得到一个如下所示的字符串文件:
"%[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]@";
一旦你对字符串文件进行了本地化,就可以将该文件传回谓词编辑器,并且它将提取已翻译的值,发挥其魔力,一切都将正确显示。
答案 1 :(得分: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()
}
}