首页 > 解决方案 > SwiftUI - 多个变量在变化时会相互反应吗?

问题描述

我有几个相互之间有特定关系的变量(即每个变量都可以通过数学函数相互转换)。它们都可以由用户调整,我希望它们都可以在其中一个更新时进行更改。例如:

struct SliderView: View {
    @State var feet: Float = 0
    @State var yards: Float = 0
    @State var miles: Float = 0
    var body: some View {
        VStack {
            Text("Feet = \(feet)")
            Slider(value: $feet, in: 0...5280, step: 1)
            Text("Yards = \(yards)")
            Slider(value: $yards, in: 0...1760, step: 0.1)
            Text("Miles = \(miles)")
            Slider(value: $miles, in: 0...1, step: 0.0001)
        }
    }
}

我怎样才能使它改变一个变量会自动改变其他变量?

标签: iosswiftswiftui

解决方案


我同意 Kyle Beard 的观点。这是一个例子:

class Model: ObservableObject {

    var changing = false

    @Published var feet: Float = 0 {
        willSet {
            guard !changing else {
                return
            }
            self.changing.toggle()
            self.miles = newValue / 5280
            self.yards = newValue / 3
            self.changing.toggle()
        }
    }

    @Published var yards: Float = 0 {
        willSet {
            guard !changing else {
                return
            }
            self.changing.toggle()
            self.miles = newValue / 1760
            self.feet = newValue * 3
            self.changing.toggle()
        }
    }

    @Published var miles: Float = 0 {
        willSet {
            guard !changing else {
                return
            }
            self.changing.toggle()
            self.feet = newValue * 5280
            self.yards = newValue * 1760
            self.changing.toggle()
        }
    }
}


struct ContentView: View {

    @ObservedObject var model = Model()

    var body: some View {
        VStack {
            Text("Feet = \(self.model.feet)")
            Slider(value: self.$model.feet, in: 0...5280, step: 1)
            Text("Yards = \(self.model.yards)")
            Slider(value: self.$model.yards, in: 0...1760, step: 0.1)
            Text("Miles = \(self.model.miles)")
            Slider(value: self.$model.miles, in: 0...1, step: 0.0001)
        }
    }
}

我希望这有帮助。


推荐阅读