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

Posted

技术标签:

【中文标题】SwiftUI Picker 在同一视图中更改第二个状态变量【英文标题】:SwiftUI Picker to change second state var in the same View 【发布时间】:2021-03-01 05:18:03 【问题描述】:

我对 SwiftUI 状态变量的理解缺少一些东西。

我有一个 Picker,我想将 Picker 中的值应用到另一个 State var。

具体来说,我想使用 Picker 来检测 MassUnit 并将新的 MassUnit 应用于测量。选择 MassUnit 时,测量使用 .convert 或 .converted 将 Measurement 更改为新单位。

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

我做错了什么? (我尝试过应用 Binding var,但没有成功。我的理解是这个视图应该能够改变这个 state 属性。)

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

【问题讨论】:

我投票结束这个问题,因为这个问题是基于一个错误的前提。真正的问题不在所提供的代码范围内。 【参考方案1】:

不需要$ 符号和包装值。可以直接赋值。

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

还有,

Text(unitFormatter.string(from: massUnit))

【讨论】:

以上是关于SwiftUI Picker 在同一视图中更改第二个状态变量的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Picker 视图在 TabView 中消失

SwiftUI Picker 视图中不显示值

视图中的 SwiftUI Picker 会在点击时自行禁用

iOS 15 SwiftUI 3 Picker 绑定在更改@State 值后不起作用

在 SwiftUI 中,我如何知道 Picker 选择何时更改?为啥 didSet 不起作用?

SwiftUI Picker 多个错误,核心数据,布局