我正在使用ForEach
解析模型列表并为每个模型创建一个视图,每个视图都包含一个Button
和一个Text
,其中{{1} }切换可见性状态,该状态应隐藏文本并更改Button的标题(“不可见” /“可见”)。
Button
不幸的是,它不起作用,当按下struct ContentView: View {
var colors: [MyColor] = [MyColor(val: "Blue"), MyColor(val: "Yellow"), MyColor(val: "Red")]
var body: some View {
ForEach(colors, id: \.uuid) { color in
ButtonColorView(color: color.val)
}
}
}
struct ButtonColorView: View {
var color: String
@State var visible = true
var body: some View {
if visible {
return AnyView( HStack {
Button("Invisible") {
self.visible.toggle()
}
Text(color)
})
} else {
return AnyView(
Button("Visible") {
self.visible.toggle()
}
)
}
}
}
class MyColor: Identifiable {
let uuid = UUID()
let val: String
init(val: String) {
self.val = val
}
}
时,ForEach
内部的视图不会改变。我用Button
取代了Foreach
,它似乎可以正常工作,所以我想说问题出在ButtonColorView(color: colors[0].val)
。
我还在ForEach
中尝试了断点,并且似乎在触发Button返回正确的视图时调用了该视图,无论如何该视图都不会在屏幕上更新。
那么,我是否以错误的方式使用了ButtonColorView
?
此问题发生在更复杂的应用程序中,但我尝试在此小示例中提取它。总结一下:我需要ForEach
根据其状态(在这种情况下为可见性)返回不同的视图
PS:我正在使用Xcode 11 Beta 6
答案 0 :(得分:1)
您正在正确使用ForEach。我认为是ButtonColorView主体中的if语句引起了问题。试试这个:
struct ButtonColorView: View {
var color: String
@State var visible = true
var body: some View {
HStack {
Button(visible ? "Invisible" : "Visible") {
self.visible.toggle()
}
if visible {
Text(color)
}
}
}
}
您还可以尝试以下操作:
struct ButtonColorView: View {
var color: String
@State var visible = true
var body: some View {
HStack {
if visible {
HStack {
Button("Invisible") {
self.visible.toggle()
}
Text(color)
}
} else {
Button("Visible") {
self.visible.toggle()
}
}
}
}
}