我有一个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不起作用
答案 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)
}
}
}