Swiftui 嵌套数组中已发布的变量不是';t显示更改

Swiftui 嵌套数组中已发布的变量不是';t显示更改,swiftui,Swiftui,我有一个数组(foos),其中包含另一个数组(bar),该数组有一个已发布的变量isExpanded。对于每个条,我希望根据iExpanded的状态显示一个图像 我的问题在于,单击切换布尔值的按钮时,图像不会改变 class Bar: ObservableObject, Identifiable { @Published var isExpanded = false var id = UUID() } class Foo: ObservableObject, Identifia

我有一个数组(foos),其中包含另一个数组(bar),该数组有一个已发布的变量isExpanded。对于每个条,我希望根据iExpanded的状态显示一个图像

我的问题在于,单击切换布尔值的按钮时,图像不会改变

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


谢谢我还使用了一些函数来创建视图,我必须更改这些视图以传入索引,而不是对象,以使其工作(这不在我发布的代码中),但答案是有效的。我仍然有点不明白什么与我拥有的不同,但我会接受:)不同之处在于结构和类的内存存储/处理方式不同。。。