首页 > 解决方案 > 如何将 EnvironmentObject 变量绑定到滑块

问题描述

我有一个 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)
        }
    }
}

这通常适用于文本之类的东西,但是在这里,当我尝试使用 $ 符号绑定到滑块之类的东西时,它会给出一个编译错误

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 for sliderVal 成功构建,但在运行时给我这个错误

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

这使得因为@State 事情应该是私有的。

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

标签: swiftui

解决方案


我在这里找到了答案,诀窍是移动 $ 而不是使用 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)
        }
    }
}

推荐阅读