Swift 快捷界面:滑块不';不要停留在他们的立场上

Swift 快捷界面:滑块不';不要停留在他们的立场上,swift,swiftui,Swift,Swiftui,我的应用程序为潜水员计算一些重要值,如最大深度等,单位为米或英尺。计算结果写在一个单独的文件中。当我在另一个位置更改滑块值时,例如最大值上的所有值(90%和1.6bar(在右侧完成)),然后将选择器从公制更改为英制,滑块将捕捉回其起始位置(32%和1.2bar),但设置的值将保留。看图片。我能做什么 启动应用程序: 更改值: 改为帝国;滑块回扣: struct ContentView: View { @State var unitSelection = UserD

我的应用程序为潜水员计算一些重要值,如最大深度等,单位为米或英尺。计算结果写在一个单独的文件中。当我在另一个位置更改滑块值时,例如最大值上的所有值(90%和1.6bar(在右侧完成)),然后将选择器从公制更改为英制,滑块将捕捉回其起始位置(32%和1.2bar),但设置的值将保留。看图片。我能做什么

启动应用程序:

更改值:

改为帝国;滑块回扣:

    struct ContentView: View {
    
    @State var unitSelection = UserDefaults.standard.integer(forKey: "Picker")
    @State var O2_2 = 32
    @State var value1: Int = 32
    @State var value2: Double = 1.2
    @State var PO2_2 = 1.2
    
    var body: some View {
        ZStack {
            VStack {
                Picker("", selection: $unitSelection) {
                    Text("Metric").tag(0)
                    Text("Imperial").tag(1)
                }
                .pickerStyle(SegmentedPickerStyle()).padding(.horizontal, 89)
                .onReceive(Just(unitSelection)) {
                    UserDefaults.standard.set($0, forKey: "Picker")
                    switchMeasurement(measurement: $0)
                }
                Spacer()
            }
            BasicStructure(valueIndexO2Calculate_3: $O2_2, PO2_1: $PO2_2, value1: $value1, value2: $value2, unitSelection_1: unitSelection)
        }
    }
}

struct BasicStructure: View {
    //Variable from Picker: Calculate -> O2
    @Binding var valueIndexO2Calculate_3: Int
    @Binding var PO2_1: Double
    @Binding var value1: Int
    @Binding var value2: Double
     var unitSelection_1: Int
    
    var body: some View {
        VStack {
            HStack {
                Spacer()
            }
            Calculate(O2: $valueIndexO2Calculate_3, PO2: $PO2_1, value1: $value1, unitSelection_2: unitSelection_1)
                
            SliderOne(value1: $value1)
            SliderFour(value2: $value2)
            Spacer()
        }
    }
}

struct Calculate: View {
    @Binding var O2: Int
    @Binding var PO2: Double
    @Binding var value1: Int
    var unitSelection_2: Int
    
    var body: some View {
        VStack {
//O2 max. depth
            HStack (alignment: .center){
                VStack(alignment: .leading) {
                    Text("O2 max. depth")
                    Text("MOD O2")
                }
                Spacer()
                Text(calculateMod02(o2: self.value1, po2: Float(self.PO2), measurement: unitSelection_2))
                    .padding(.trailing)
            }
                    .padding(.top).padding(.horizontal)
            Divider()
//eq. air depth
            HStack(alignment: .center) {
                VStack(alignment: .leading) {
                    Text("eq. air depth")
                    Text("EAD")
                }
                Spacer()
                Text(calculateEAD(o2: self.value1, po2: Float(self.PO2), measurement: unitSelection_2))
                    .padding(.trailing)
            }
                    .padding(.horizontal)
            Divider()
//no deco time
            HStack(alignment: .center) {
                VStack(alignment: .leading) {
                    Text("no deco time")
                    Text("DECO 2000")
                }
                Spacer()
                Text("\(calculateDeco2000(o2: self.O2, po2: Float(self.PO2), measurement: unitSelection_2), specifier: "%.0f")'")
                    .padding(.trailing)
            }
                    .padding(.horizontal)
            Divider()
//max. dive time
            HStack(alignment: .center) {
                VStack(alignment: .leading) {
                    Text("max. dive time")
                    Text("CNS")
                }
                Spacer()
                Text("\(calculateCNS(o2: self.O2, po2: Float(self.PO2), measurement: unitSelection_2), specifier: "%.0f")'")
                    .padding(.trailing)
            }
                    .padding(.horizontal).padding(.bottom)
        }
        .padding()
    }
}

struct SliderOne: View {
    @ObservedObject var sliderBindingManager = SliderBindingManager(value: 32)
    @Binding var value1: Int
    
    var body: some View {
        Slider(value: $sliderBindingManager.value, in: 21...90, step: 1)
        .onChange(of: sliderBindingManager.value) {
            if $0 > 50 {
                sliderBindingManager.value = ($0 / 10).rounded(.toNearestOrEven) * 10
            }
            value1 = Int(sliderBindingManager.value)
        }
        Text("\(value1)% O2")
    }
}

struct SliderFour: View {
    @ObservedObject var sliderBindingManager = SliderBindingManager(value: 1.2)
    @Binding var value2: Double
    
    var body: some View {
        Slider(value: $sliderBindingManager.value, in: 1.2...1.6, step: 0.1)
        .onChange(of: sliderBindingManager.value) {
            if $0 > 50 {
                sliderBindingManager.value = ($0 / 10).rounded(.toNearestOrEven) * 10
            }
            value2 = Double(sliderBindingManager.value)
        }
        Text("\(value2, specifier: "%.1f")bar PO2")
    }
}

class SliderBindingManager: ObservableObject {
    @Published var value: Double
    init(value: Double) { self.value = value }
}