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

Ios 视图不会在SwiftUI中的ForEach内部更新,ios,swift,swiftui,Ios,Swift,Swiftui,我正在使用ForEach解析模型列表并为每个模型创建一个视图,每个视图都包含一个按钮和一个文本,按钮切换可见性状态,该状态应隐藏文本并更改按钮标题(不可见/可见) 不幸的是,它不工作,按下按钮时,ForEach内的视图不会改变。我将Foreach替换为ButtonColorView(颜色:colors[0].val),它似乎可以工作,所以我认为问题出在Foreach 我还在ButtonColorView中尝试了断点,当按钮被触发返回右视图时,视图似乎被调用,无论如何,视图不会在屏幕上更新 那么,

我正在使用
ForEach
解析模型列表并为每个模型创建一个视图,每个视图都包含一个
按钮和一个
文本
按钮
切换可见性状态,该状态应隐藏文本并更改按钮标题(不可见/可见)

不幸的是,它不工作,按下
按钮时,
ForEach
内的视图不会改变。我将
Foreach
替换为
ButtonColorView(颜色:colors[0].val)
,它似乎可以工作,所以我认为问题出在
Foreach

我还在
ButtonColorView
中尝试了断点,当按钮被触发返回右视图时,视图似乎被调用,无论如何,视图不会在屏幕上更新

那么,我是否以错误的方式使用了ForEach的
ForEach

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


注:我使用的是Xcode 11 Beta 6

您正确使用了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()
                }
            }
        }
    }

}

请将ButtonColorView的初始值设定项与color属性共享好吗?@ασληΔ。ButtonColorView没有初始值设定项,因为它是一个结构,我使用默认的init:
ButtonColorView(color:color.val)
。这是完整的代码,如果您想测试它,可以在Xcode中复制它。您创建了ContentView类型的结构对象,它继承了视图。视图结构不在基础框架中,所以我们没有视图结构,所以我们不能测试它。初始值设定项视图(颜色:MyColor)位于您尚未发布的视图结构文件中。@ΒασληΔ。视图在SwiftUI框架中,正如我在标题中提到的,这是一个SwiftUI应用程序…尝试更新主线程上的颜色?正如我所说,这是一个小示例,用于说明复杂应用程序中出现的问题。您的解决方案解决了这个特殊情况下的问题,不幸的是我无法在我的应用程序中应用它,问题是我需要
按钮颜色视图
根据其状态返回不同的视图,它可能是
文本
部分
空视图
。在您的解决方案中,
ButtonColorView
总是返回一个
HStack
,使其工作,但在实际情况中,我不能将所有内容都包装在
HStack
中。非常感谢。问题肯定是ButtonColorView主体中的if语句。也许你可以分享更多你的实际项目-这会使帮助更容易。实际的
ButtonColorView
看起来像
var body:some视图{let props=model.properties let View=“Whatever View”if props.visible{return AnyView(View)}else{return AnyView(EmptyView())}
因此我不能删除
if
并且我也不能添加HStack,因为它是由设计破坏的:(如果我使用
List
而不是
ForEach
它似乎工作得很好,但我不需要列表
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()
                }
            }
        }
    }

}