【问题标题】:NSPredicateEditorRowTemplate, specifying of Key Path with spaces?NSPredicateEditorRowTemplate,用空格指定键路径?
【发布时间】:2011-05-09 22:10:42
【问题描述】:
根据前面的问题,我很不情愿地放弃了使用 IB/Xcode4 来编辑 NSPredicateEditor 并纯粹在代码中完成。
在编辑字段的 GUI 方式中,可以使用空格指定键路径,例如“字段名称”,这使它们可以作为“字段名称”样式的键路径,同时仍然使用空格在 UI 中显示它们。我如何在代码中做到这一点?当我用空格指定它们时,它们不起作用。当我在 camelCase 中指定它们时,它们可以工作但在 camelCase 中显示。我只是像这样添加一堆 NSExpressions:
[NSExpression expressionForKeyPath:@"original filename"]
【问题讨论】:
标签:
objective-c
cocoa
nspredicateeditor
【解决方案1】:
在谓词编辑器的行视图中获取人类可读字符串的正确方法是使用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]@";
将字符串文件本地化后,将该文件交还给谓词编辑器,它会提取翻译后的值,发挥作用,一切都会正确显示。
【解决方案2】:
如果您不想本地化所有内容,只需映射关键路径,考虑在评估对象中覆盖 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()
}
}