SwiftUI Picker在同一个视图中改变第二个状态变量



我对SwiftUI State变量的理解有些欠缺。

我有一个Picker,我想把这个Picker的值应用到另一个State变量。

具体来说,我想使用一个Picker来检验一个MassUnit,并将新的MassUnit应用到一个Measurement。当选择MassUnit时,测量使用。convert或。convert将测量更改为新单位。

如果你看下面的代码,转换的值是正确计算的,但我不能将max设置为新值,也不能使用max。转换来改变它

我做错了什么?(我已经尝试应用绑定变量,但没有工作。我的理解是,这个视图应该能够改变这个状态属性。

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

不需要$符号和换行值。可以直接赋值。

.onChange(of: massUnit, perform: { newMassUnit in
let converted = max.converted(to: newMassUnit)
max = converted
max.convert(to: newMassUnit)
})

,

Text(unitFormatter.string(from: massUnit))

相关内容

最新更新