已解决:整个问题都被误导了。该代码有效。问题出在我的 MeasurementFormatter 中,它没有按预期更新,让我觉得属性包装器没有按预期工作。
================
我对 SwiftUI 状态变量的理解缺少一些东西。
我有一个 Picker,我想将 Picker 中的值应用到另一个 State var。
特别是我想使用 Picker 来观察 MassUnit 并将新的 MassUnit 应用于测量。选择 MassUnit 后,测量使用 .convert 或 .converted 将测量更改为新单位。
如果你看下面的代码,converted 的值是正确计算的,但我不能将 max 设置为新值,也不能使用 max.convert 来改变它。
我做错了什么? (我曾尝试应用 Binding var,但没有奏效。我的理解是此视图应该能够改变此状态属性。)
import SwiftUI
struct ConverterView: View
{
@State var massUnit: UnitMass = .pounds
@State var min: Measurement<UnitMass> = Measurement(value: 1, unit: .pounds)
@State var max: Measurement<UnitMass> = Measurement(value: 1.5, unit: .pounds)
private let massFormatter = MewsMassFormatter()
private let unitFormatter = MewsMassFormatter(style: .long)
var body: some View {
Form {
Picker(selection: $massUnit,
label: Text("Weight Units"),
content: {
ForEach(massUnits, id: \.symbol) {
Text(unitFormatter.string(from: $0)).tag($0)
}
})
.onChange(of: $massUnit.wrappedValue, perform: { newMassUnit in
let converted = $max.wrappedValue.converted(to: newMassUnit)
$max.wrappedValue = converted //doesn't work
$max.wrappedValue.value = converted.value //doesn't work
// $max.wrappedValue.unit = converted.unit //doesn't compile
$max.wrappedValue.convert(to: newMassUnit) //doesn't work
})
TextField("Min", value: $min, formatter: massFormatter).keyboardType(.decimalPad)
TextField("Max", value: $max, formatter: massFormatter).keyboardType(.decimalPad)
Text(unitFormatter.string(from: $massUnit.wrappedValue))
}
}
}
struct ConverterView_Previews: PreviewProvider {
static var previews: some View {
ConverterView()
}
}
答案 0 :(得分:1)
不需要 $
符号和包装值。可以直接赋值。
.onChange(of: massUnit, perform: { newMassUnit in
let converted = max.converted(to: newMassUnit)
max = converted
max.convert(to: newMassUnit)
})
还有,
Text(unitFormatter.string(from: massUnit))