这个问题是SwiftUI: How to get continuous updates from Slider之后的一个后续问题
基本上,我有一个滑块,它是许多滑块之一。每个on都会更改模型类上的参数,因此我要传递一个表示模型类上特定属性的绑定。这样做的原因是,滑块每次移动时,模型都会获取新值。
struct AspectSlider: View {
private var value: Binding<Double>
init(value: Binding<Double>, hintKey: String) {
self.value = value
}
var body: some View {
VStack(alignment: .trailing) {
Text("\(self.value.value)")
Slider(value: Binding<Double>(getValue: { self.value.value }, setValue: { self.value.value = $0 }),
from: 0.0, through: 4.0, by: 0.5)
}
}
}
Text("\(self.value.value)")
显示无法正常工作,该显示旨在显示滑块的当前值。 Binding<Double>
值更改时不会更新。
相反,它仅在显示器上的其他内容触发显示器刷新时才更新。在我的情况下,代表模型执行的计算结果的标签(当滑块更改其值时不一定会更改)。
我已经确认模型正在更改,因此绑定正在更新。我的问题是,为什么文本标签没有立即更新。
答案 0 :(得分:0)
您的代码(如果这样调用)可以正常工作:
struct ContentView: View {
@State private var value: Double = 0
var body: some View {
AspectSlider(value: $value, hintKey: "hint")
}
}
struct AspectSlider: View {
private var value: Binding<Double>
init(value: Binding<Double>, hintKey: String) {
self.value = value
}
var body: some View {
VStack(alignment: .trailing) {
Text("\(self.value.value)")
Slider(value: Binding<Double>(getValue: { self.value.value }, setValue: { self.value.value = $0 }),
from: 0.0, through: 4.0, by: 0.5)
}
}
}
请注意,您还可以利用属性包装器@Binding
来避免使用self.value.value
。您的实现应略有变化:
struct AspectSlider: View {
@Binding private var value: Double
init(value: Binding<Double>, hintKey: String) {
self.$value = value
}
var body: some View {
VStack(alignment: .trailing) {
Text("\(self.value)")
Slider(value: Binding<Double>(getValue: { self.value }, setValue: { self.value = $0 }),
from: 0.0, through: 4.0, by: 0.5)
}
}
}
答案 1 :(得分:0)
好吧,我已经弄清楚了为什么我的代码没有得到应有的更新。归结为我的模型(简单版本):
final class Calculator: BindableObject {
let didChange = PassthroughSubject<Int, Never>()
var total: Int = 0
var clarity: Double = 0.0 { didSet { calculate() }}
private func calculate() {
if newValue.rounded() != Double(total) {
total = Int(newValue)
didChange.send(self.total)
}
}
}
发生的事情是,仅当此模型执行didChange.send(self.total)
行时,sider的值才更新。我认为,如果我做对了,那是因为标签正在监视绑定,所以只有在绑定更新时标签才会更新。说得通。仍在解决这个问题。
我想这是学习组合以及它如何工作的一部分:-)