我已经实现了一个NSMeasurementFormatter,但是遇到了一个奇怪的问题。当应用程序以en_US为加载语言时,我将所有的重量加载到文本框中作为磅,非常好。然而,当我将我的应用程序切换到en_GB并加载相同的数据时,文本框中没有任何内容显示。
当我打印对象时,打印输出会以kg为单位显示重量,因此它们被正确地转换了,但它们没有加载到实际的文本框中以供用户查看。
这个问题有明显的原因吗?我花了几个小时试图弄清楚为什么它适用于一个位置但不适用于另一个位置!感谢您的洞察力,以下是代码:
以下是对一项练习的初始保存,其中它根据应用程序在此点上的设置而向前或向后进行。
然后这里是我的尝试,稍后重新加载此对象的重量属性。
当设置为美国时,我可以看到以两位小数显示的磅数,但当我将其设置为英国时,我看不到任何可见的内容,我只能在对象的输出中看到转换。以下是加载两个例程的控制台和结果截图:![enter image description here](https://istack.dev59.com/rX9K0.webp)
![enter image description here](https://istack.dev59.com/XOJ0e.webp)
使用MassFormatter信息进行更新如下:
当我打印对象时,打印输出会以kg为单位显示重量,因此它们被正确地转换了,但它们没有加载到实际的文本框中以供用户查看。
这个问题有明显的原因吗?我花了几个小时试图弄清楚为什么它适用于一个位置但不适用于另一个位置!感谢您的洞察力,以下是代码:
以下是对一项练习的初始保存,其中它根据应用程序在此点上的设置而向前或向后进行。
if self.localeIdentifier == "en_GB" {
let kgWeight = Measurement(value: Double(self.userExerciseWeight.text!)!, unit: UnitMass.kilograms)
newUserExercise.weight = kgWeight as NSObject?
newUserExercise.initialMetricSystem = self.localeIdentifier
print("SAVED AS \(localeIdentifier) METRIC")
} else if self.localeIdentifier == "en_US" {
let lbsWeight = Measurement(value: Double(self.userExerciseWeight.text!)!, unit: UnitMass.pounds)
newUserExercise.weight = lbsWeight as NSObject?
newUserExercise.initialMetricSystem = self.localeIdentifier
print("SAVED AS \(localeIdentifier) IMPERIAL")
}
然后这里是我的尝试,稍后重新加载此对象的重量属性。
let formatter = MeasurementFormatter()
let exerciseWeight = userExercise.weight as! Measurement<Unit>
let localeIdentifier = UserDefaults.standard.object(forKey: "locale")
let locale = Locale(identifier: localeIdentifier as! String)
formatter.locale = locale
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 2
formatter.numberFormatter = numberFormatter
let finalWeight = formatter.string(from: exerciseWeight)
cell.todaysExerciseWeightLabel.text = finalWeight
}
当设置为美国时,我可以看到以两位小数显示的磅数,但当我将其设置为英国时,我看不到任何可见的内容,我只能在对象的输出中看到转换。以下是加载两个例程的控制台和结果截图:
![enter image description here](https://istack.dev59.com/rX9K0.webp)
![enter image description here](https://istack.dev59.com/XOJ0e.webp)
![enter image description here](https://istack.dev59.com/6DR4b.webp)
let localeIdentifier = UserDefaults.standard.object(forKey: "locale") as! Locale
let exerciseWeight = userExercise.weight as! Measurement<Unit>
let formatter = MassFormatter()
formatter.numberFormatter.locale = localeIdentifier
formatter.numberFormatter.maximumFractionDigits = 2
if localeIdentifier.usesMetricSystem {
let kgWeight = exerciseWeight.converted(to: .kilograms)
let finalKgWeight = formatter.string(fromValue: kgWeight.value, unit: .kilogram)
cell.todaysExerciseWeightLabel.text = finalKgWeight
print(formatter.string(fromValue: kgWeight.value, unit: .kilogram))
} else {
let kgWeight = exerciseWeight.converted(to: .pounds)
let finalLbWeight = formatter.string(fromValue: exerciseWeight.value, unit: .pound)
cell.todaysExerciseWeightLabel.text = finalLbWeight
print(formatter.string(fromValue: exerciseWeight.value, unit: .pound))
}
}
}