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