Swiftui 嵌套数组中已发布的变量不是';t显示更改
我有一个数组(foos),其中包含另一个数组(bar),该数组有一个已发布的变量isExpanded。对于每个条,我希望根据iExpanded的状态显示一个图像 我的问题在于,单击切换布尔值的按钮时,图像不会改变Swiftui 嵌套数组中已发布的变量不是';t显示更改,swiftui,Swiftui,我有一个数组(foos),其中包含另一个数组(bar),该数组有一个已发布的变量isExpanded。对于每个条,我希望根据iExpanded的状态显示一个图像 我的问题在于,单击切换布尔值的按钮时,图像不会改变 class Bar: ObservableObject, Identifiable { @Published var isExpanded = false var id = UUID() } class Foo: ObservableObject, Identifia
class Bar: ObservableObject, Identifiable {
@Published var isExpanded = false
var id = UUID()
}
class Foo: ObservableObject, Identifiable {
@Published var bars:[Bar] = []
var id = UUID()
}
class FooList: ObservableObject {
@Published var foos:[Foo] = []
init(array: [Foo]) {
foos = array
}
}
struct ContentView: View {
@ObservedObject var fooList:FooList = createFoos()
var body: some View {
VStack {
ForEach(fooList.foos) { foo in
ForEach(foo.bars) { bar in
Button(action: {
bar.isExpanded.toggle()
}, label: {
if bar.isExpanded {
Image(systemName: "minus.app")
} else {
Image(systemName: "plus.app")
}
})
}
}
}
}
}
func createFoos() -> FooList {
var foos = [Foo]()
for x in 0...5 {
let foo = Foo()
for y in 0...5 {
let bar = Bar()
foo.bars.append(bar)
}
foos.append(foo)
}
return FooList(array: foos)
}
不确定它是否相关,但我还必须创建一个第三类傻瓜来保存foos数组,因为我无法从对象数组中创建ObservedObject,例如:
@ObservedObject var fooList:[Foo] = createFoos()
我一直在思考这个问题,我猜这是一个基本的范例,我只是还不明白。感谢您的帮助 将模型从基于参考更改为基于价值,以下是您期望的行为 注意:使用类也可以,但需要将内部更新交叉连接到外部容器,这是SwiftUI观察到的,因此更复杂。在任何内部级别更改值都会完全更改模型 所以,这里是
struct Bar {
var isExpanded = false
var id = UUID()
}
struct Foo {
var bars:[Bar] = []
var id = UUID()
}
class FooList: ObservableObject {
@Published var foos:[Foo] = []
init(array: [Foo]) {
foos = array
}
}
struct TestPublishedModelChanged: View {
@ObservedObject var fooList:FooList = createFoos()
var body: some View {
VStack {
ForEach(Array(fooList.foos.enumerated()), id:\.1.id) { (i, foo) in
ForEach(Array(foo.bars.enumerated()), id: \.1.id) { (j, bar) in
Button(action: {
self.fooList.foos[i].bars[j].isExpanded.toggle()
}, label: {
if self.fooList.foos[i].bars[j].isExpanded {
Image(systemName: "minus.square")
} else {
Image(systemName: "plus.square")
}
})
}
}
}
}
}
func createFoos() -> FooList {
var foos = [Foo]()
for _ in 0...2 {
var foo = Foo()
for _ in 0...2 {
let bar = Bar()
foo.bars.append(bar)
}
foos.append(foo)
}
return FooList(array: foos)
}
谢谢我还使用了一些函数来创建视图,我必须更改这些视图以传入索引,而不是对象,以使其工作(这不在我发布的代码中),但答案是有效的。我仍然有点不明白什么与我拥有的不同,但我会接受:)不同之处在于结构和类的内存存储/处理方式不同。。。