繁体   English   中英

更改 @State 变量不会更新 SwiftUI 中的视图

[英]Changing @State variable does not update the View in SwiftUI

我有以下观点(去掉不相关的部分):

struct Chart : View {
    var xValues: [String]
    var yValues: [Double]
    @State private var showXValues: Bool = false

    var body = some View {
        ...
        if showXValues {
            ...
        } else {
            ...
        }
        ...
    }
}

然后我想添加一种从外部修改这个值的方法,所以我添加了一个函数:

func showXValues(show: Bool) -> Chart {
    self.showXValues = show
    return self
}

所以我像这样从外部构建图表视图:

Chart(xValues: ["a", "b", "c"], yValues: [1, 2, 3])
    .showXValues(true)

但它的工作方式就好像该值仍然为假。 我究竟做错了什么? 我认为更新 @State 变量应该更新视图。 总的来说,我对 Swift 很陌生,对 SwiftUI 更是如此,我是否缺少某种应该在这里使用的特殊技术?

正如在提到的评论中, @Binding是要走的路。

这是一个最小的示例,显示了您的代码的概念:

struct Chart : View {
    var xValues: [String]
    var yValues: [Double]
    @Binding var showXValues: Bool

    var body: some View {
        if self.showXValues {
            return Text("Showing X Values")
        } else {
            return Text("Hiding X Values")
        }
    }
}

struct ContentView: View {
    @State var showXValues: Bool = false

    var body: some View {
        VStack {
            Chart(xValues: ["a", "b", "c"], yValues: [1, 2, 3], showXValues: self.$showXValues)
            Button(action: {
                self.showXValues.toggle()
            }, label: {
                if self.showXValues {
                    Text("Hide X Values")
                }else {
                    Text("Show X Values")
                }
            })
        }
    }
}

好吧,答案很愚蠢。

无需创建func -s。 我所要做的不是将属性标记为私有,而是给它们一个初始值,这样它们就会在构造函数中成为可选的。 所以用户可以指定它们,也可以不关心。 像这样:

var showXLabels: Bool = false

这样构造函数是Chart(xLabels:yLabels)Chart(xLabels:yLabels:showXLabels)

问题与@State 无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM