在SwiftUI中,视图不会在ForEach内部更新

时间:2019-08-28 07:02:12

标签: ios swift swiftui

我正在使用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

enter image description here

此问题发生在更复杂的应用程序中,但我尝试在此小示例中提取它。总结一下:我需要ForEach根据其状态(在这种情况下为可见性)返回不同的视图

PS:我正在使用Xcode 11 Beta 6

1 个答案:

答案 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()
                }
            }
        }
    }

}