如何将EnvironmentObject变量绑定到滑块

时间:2019-07-03 18:20:03

标签: swiftui

我有一个sliderVal,需要在其他地方进行访问,所以我的理解是我应该使用EnvironmentObject(或BindableObject,但EnvironmentObject很好,因为在子视图中也使用了它)来保存这些值。像这样

struct ExampleView : View {

    @EnvironmentObject var externalData : ExternalData

    var body: some View {
        Slider(value: self.externalData.$sliderVal, from: 1, through: 100, by: 1)
    }

}

final class ExternalData : BindableObject {

    let didChange = PassthroughSubject<ExternalData, Never>()

    var sliderVal : Double = 5.0 {
        didSet {
            didChange.send(self)
        }
    }
}

这通常适用于诸如Text之类的东西,但是在这里,当我尝试使用$符号绑定到类似Slider之类的东西时,它会给出

的编译错误。
Value of type 'ExternalData' has no member '$sliderVal'; did you mean 'sliderVal'?

但是仅使用sliderVal会给我错误

Cannot convert value of type 'Double' to expected argument type 'Binding<_>'

尝试在我的环境对象中将@State用于sliderVal构建成功,但是在运行时给我这个错误

Fatal error: Accessing State<Double> outside View.body

从@State开始,这应该是私有的。

正确的方法是什么?我需要能够在单独线程上的视图外部访问sliderVal,因此使用@Binding或@State不起作用

1 个答案:

答案 0 :(得分:1)

我找到了答案here,诀窍是移动$而不使用self:

struct ExampleView : View {

    @EnvironmentObject var externalData : ExternalData

    var body: some View {
        Slider(value: $externalData.sliderVal, from: 1, through: 100, by: 1)
    }

}

final class ExternalData : BindableObject {

    let didChange = PassthroughSubject<ExternalData, Never>()

    var sliderVal : Double = 5.0 {
        didSet {
            didChange.send(self)
        }
    }
}