SwiftUI - Есть ли несколько переменных реагируют друг на друга, когда они меняются? - PullRequest
1 голос
/ 12 января 2020

У меня есть несколько переменных, которые имеют определенные c отношения друг с другом (ie каждая может быть преобразована друг в друга с помощью математических функций). Все они настраиваются пользователем, и я бы хотел, чтобы все они менялись при каждом обновлении одного из них. Например:

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

Как я могу сделать так, чтобы изменение одной переменной автоматически изменило другие?

Ответы [ 2 ]

1 голос
/ 13 января 2020

Я согласен с Кайлом Бердом .. вот пример:

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

Надеюсь, это поможет.

0 голосов
/ 13 января 2020

Вы можете привязать каждое значение к соответствующему ползунку, а затем, когда вызывается willSet(), у вас может быть общая функция, которая вызывается, чтобы затем обновить все три в зависимости от того, когда было изменено одно.

Посмотрите здесь на этот ответ, используя Combine для отслеживания непрерывных обновлений на слайдере. Обратите внимание, что в этом ответе используется BindableObject, но с тех пор Apple изменила имя на ObservableObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...