我正在编写一个方法,它将给出CNPostalAddress元素的本地化名称。我试图检索的本地化键是全局常量。
/// Get the localised name of a CNPostalAddress element
///
/// - Parameter field: CNPostalAddress element name (Street, SubLocality, City, SubAdministrativeArea, State, PostalCode, Country, ISOCountryCode)
/// - Returns: localized name of the address field
func localizedAddressFieldName(for field: String) -> String? {
let keyPathKey = "CNPostalAddress\(field)Key"
if let localizationKey = value(forKey: keyPathKey) as? String {
return CNPostalAddress.localizedString(forKey: localizationKey)
} else {
return nil
}
}但是,当使用以下日志获取localizationKey时,应用程序会崩溃:
终止应用程序,原因是:“ valueForUndefinedKey::该类不符合键CNPostalAddressStreetKey的键值编码。”
CNPostalAddressStreetKey是一个有效的键,如苹果文档所示,但它是一个全局常量。
溶液
extension CNPostalAddress {
class func localizedAddressFieldName(for field: String) -> String? {
let localizationKey = field.decapitalizingFirstLetter()
return CNPostalAddress.localizedString(forKey: localizationKey)
}
}
extension String {
func decapitalizingFirstLetter() -> String {
let firstLetterLowercase = String(prefix(1)).lowercased()
return firstLetterLowercase + String(dropFirst())
}
}发布于 2018-01-19 14:15:20
这是因为您可能不得不使用这些变量来代替:
print("\(CNPostalAddress.localizedString(forKey: "subLocality"))")
print("\(CNPostalAddress.localizedString(forKey: "street"))")因此,不是
let keyPathKey = "CNPostalAddress\(field)Key"你应该使用
let keyPathKey = "\(field)"这是区分大小写的,所以你可能需要做一些调整。
请参阅这里
发布于 2018-01-19 14:16:57
首先,value(forKey: keyPathKey)是在NSKeyValueCoding协议中定义的方法,您正在viewController中调用该方法,这就是为什么要避免崩溃,您必须在ViewController中实现该方法。
override func value(forKey key: String) -> Any? {
},但无论如何,我认为您不需要在第一次实例中调用此方法
func localizedAddressFieldName(for field: String) -> String? {
let localizationKey = "CNPostalAddress\(field)Key"
return CNPostalAddress.localizedString(forKey: localizationKey)
}如果您的键没有在CNPostalAddress中定义,则结果将是一个空字符串。
https://stackoverflow.com/questions/48342703
复制相似问题