SwiftUI:在单独的标签中显示滑块位置

时间:2019-07-14 09:53:53

标签: swiftui

这个问题是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>值更改时不会更新。

相反,它仅在显示器上的其他内容触发显示器刷新时才更新。在我的情况下,代表模型执行的计算结果的标签(当滑块更改其值时不一定会更改)。

我已经确认模型正在更改,因此绑定正在更新。我的问题是,为什么文本标签没有立即更新。

2 个答案:

答案 0 :(得分:0)

您的代码(如果这样调用)可以正常工作:

enter image description here

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的值才更新。我认为,如果我做对了,那是因为标签正在监视绑定,所以只有在绑定更新时标签才会更新。说得通。仍在解决这个问题。

我想这是学习组合以及它如何工作的一部分:-)