NSPredicateEditorRowTemplate,用空格指定Key Path?

时间:2011-05-09 22:10:43

标签: objective-c cocoa nspredicateeditor

根据上一个问题,我不情愿地放弃使用IB / Xcode4来编辑NSPredicateEditor并完全在代码中完成。

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

[NSExpression expressionForKeyPath:@"original filename"]

2 个答案:

答案 0 :(得分:3)

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

如果您按照this blog post中的说明操作,您将拥有本地化编辑器所需的一切。

例如,假设您的密钥路径为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]@";

一旦你对字符串文件进行了本地化,就可以将该文件传回谓词编辑器,并且它将提取已翻译的值,发挥其魔力,一切都将正确显示。

答案 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()
    }
}