我有以下视图(删除了不相关的部分):
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来说更是如此,我是否缺少某种应在此处使用的特殊技术?
答案 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无关。