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

时间:2019-12-17 20:47:26

标签: ios swift 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)

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

2 个答案:

答案 0 :(得分:0)

正如所提到的评论,@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")
                }
            })
        }
    }
}

答案 1 :(得分:0)

好的,答案很愚蠢。

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

var showXLabels: Bool = false

通过这种方式,构造函数可以是Chart(xLabels:yLabels)Chart(xLabels:yLabels:showXLabels)

问题与@State无关。

相关问题