首页 > 解决方案 > SwiftUI Slider,如何更改第二个变量

问题描述

目前我的滑块只改变了我的 kms 变量,但我也希望它通过滑块每一步的百分比变量来增加或减少价格变量。有没有一种简单的方法来实现这一点?谢谢。

import SwiftUI

struct SliderStruct: View {
   
   @State var kms: Double = 100_000
   var kms2: Double = 100_000
   
   var price: Double = 5_000
   var percentage: Double = 0.05
   
   var body: some View {
       VStack{
           
           //increase price by percentage as kms decrease, decrease price by percentage as kms increase
           //price *= percentage, price /= percentage

           Text("$\(self.price, specifier: "%.0f")")
           
           Text("\(self.kms, specifier: "%.0f") Kms")
           Slider(value: $kms, in: kms2 - kms2...kms2 + kms2, step: 20_000)
       }
   }
}

标签: swiftswiftuislider

解决方案


这是一个有趣的问题,而且我以前从未尝试过,所以我快速尝试解决它(有点强迫它工作!),但要处理原始问题的限制。虽然,有些信息还是有点模糊。

class DistanceObject: ObservableObject {
    @Published var kms: Double = 100_000
    var kms2: Double = 100_000
    var price: Double = 5_000
    var pricePlaceHolder: Double = 5_000
    var percentage: Double = 0.05
    private var oldValue: Double = 100_000 // set to initial kms
    func getPrice() -> Double {
        if kms.truncatingRemainder(dividingBy: 20000) == 0.0 {
            if kms != oldValue {
                if kms < oldValue {
                    price = price + (pricePlaceHolder * percentage)
                } else if kms > oldValue {
                    price = price - (pricePlaceHolder * percentage)
                }
                oldValue = kms
            }
        }
        return price
    }
    func setPrice(price: Double) {
        self.price = price
    }
}

struct ContentView: View {
    @ObservedObject var distance: DistanceObject = DistanceObject()
    var body: some View {
        let price_mod = Binding<Double>(
            get: { return distance.getPrice() },
            set: { distance.setPrice(price: $0) }
        )
        NavigationView {
            VStack {
                Text("$\(price_mod.wrappedValue, specifier: "%.0f")")
                Text("\(distance.kms, specifier: "%.0f") Kms")
                Slider(value: $distance.kms, in: distance.kms2 - distance.kms2...distance.kms2 + distance.kms2, step: 20_000)
            }
        }
    }
}

我决定在 ContentView 中使用自定义绑定方法,并让该绑定在 ObservableObject 类对象中执行计算。这不是最好的解决方案,但这个和另一个答案应该让你朝着正确的方向前进。


推荐阅读