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

8zzbczxx  于 2023-01-06  发布在  iOS
关注(0)|答案(2)|浏览(220)

我有以下观点(删除无关部分):

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更是如此,我是否遗漏了某种应该在这里使用的特殊技术?

5cg8jx4n

5cg8jx4n1#

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

inn6fuwd2#

没有必要创建func-s.我所要做的就是不把属性标记为private,而是给予它们一个初始值,这样它们在构造函数中就变成可选的了.所以用户可以指定它们,或者不关心.就像这样:
var showXLabels: Bool = false
这样,构造函数就是Chart(xLabels:yLabels)Chart(xLabels:yLabels:showXLabels)
这个问题与“国家”无关。

相关问题