Как обновить свойство ObservableObject из вычисляемого свойства? - PullRequest
0 голосов
/ 04 мая 2020

Можно ли обновить свойство ObservableObject из вычисляемого свойства?

struct ContentView: View {
    @EnvironmentObject var foobar: Foobar
    @State var localProp1: Double = 0 {
        didSet {
            self.foobar.someInstance.prop1 = self.localProp1
        }
    }

    var body: some View {
        VStack {
            Text("localProp1 is \(String(format: "%.2f", self.localProp1))")
            Slider(value: self.$localProp1, in: 60...120, step: 1)
        }
    }
}

class Foobar: ObservableObject {
  var someInstance: SomeInstance = SomeInstance()
}

class SomeInstance {
  var prop1: Double
  ...
}

Я понимаю, что могу:

        Slider(value: self.$foobar.someInstance.prop1, in: 60...120, step: 1)

Но вариант использования, который я в идеале, позволил бы мне иметь локальная переменная. Если не найти способ обойти эту проблему, я обнаружу, что prop1 в Text(...) не обновляется при изменении.

struct ContentView: View {
    @EnvironmentObject var foobar: Foobar

    var body: some View {
        VStack {
            Text("localProp1 is \(String(format: "%.2f", self.foobar.someInstance.prop1))")
            Slider(value: self.$foobar.someInstance.prop1, in: 60...120, step: 1)
        }
    }
}

Поскольку мне нужно использовать ключевое слово @Published перед свойством, чтобы можно было хранить и Publi sh их изменения для подписчиков, но проблема в том, что я не имею контроля над «SomeInstance», я использую его из внешней библиотеки.

1 Ответ

1 голос
/ 04 мая 2020

Вы можете использовать настраиваемую привязку внутри ползунка для обновления значения. Здесь я сделал Slider View с пользовательской привязкой.

import SwiftUI

struct TestView: View {
    @EnvironmentObject var foobar: Foobar
    var body: some View {
        VStack {
            Text("localProp1 is \(String(format: "%.2f", self.foobar.someInstance.prop1))")
            MySlider()
        }
    }
}

struct MySlider: View {
    @EnvironmentObject var foobar: Foobar
    var body: some View {
        Slider(value: Binding<Double>(
            get: { () -> Double in
                return self.foobar.someInstance.prop1
        }) { (val) in
            let inst = self.foobar.someInstance
            inst.prop1 = val
            self.foobar.someInstance = inst
        }, in: 60...120, step: 1)
    }
}

class Foobar: ObservableObject {
    @Published var someInstance: SomeInstance = SomeInstance()
}

class SomeInstance {
    var prop1: Double = 70.0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...