如何将 EnvironmentObject 变量绑定到滑块
How to bind an EnvironmentObject variable to a slider
我有一个需要在其他不同地方访问的 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<_>'
尝试在我的环境对象中为 sliderVal 使用 @State 构建成功,但在运行时给我这个错误
Fatal error: Accessing State<Double> outside View.body
自从@State 以来,事情应该是私有的。
正确的做法是什么?我需要能够在单独的线程上访问视图外的 sliderVal,因此使用 @Binding 或 @State 不起作用
我找到了答案 ,诀窍是移动 $ 而不是使用 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)
}
}
}
我有一个需要在其他不同地方访问的 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<_>'
尝试在我的环境对象中为 sliderVal 使用 @State 构建成功,但在运行时给我这个错误
Fatal error: Accessing State<Double> outside View.body
自从@State 以来,事情应该是私有的。
正确的做法是什么?我需要能够在单独的线程上访问视图外的 sliderVal,因此使用 @Binding 或 @State 不起作用
我找到了答案
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)
}
}
}