gpt4 book ai didi

swift - 在 SwiftUI 中更新树结构的 UI

转载 作者:行者123 更新时间:2023-12-04 03:58:27 26 4
gpt4 key购买 nike

我有一个 ObservableObject 类,Model0其中有一个 Published对象 nested . nested对象表示递归树结构。我希望能够更新树结构并适本地更新 UI。但是,在下面的代码中,当我更新 nested 的 child 时对象,UI 未更新,我假设是因为对 nested 的引用没有改变。每当我更改 nested 中的任何内容时,如何让 UI 更新树结构中的对象?

class Nested: Identifiable {
var id: UUID = UUID()
var name: String
var children:[Nested]

init(name: String, children:[Nested]) {
self.children = children
self.name = name
}
}

class Model0 : ObservableObject {
@Published var nested: Nested

init(nested: Nested) {
self.nested = nested
}

func update() {
nested.children[0] = Nested(name:"New", children: [])
}
}

struct NestedView: View {
var nested: Nested

var body: some View {
VStack {
Text(nested.name)

ForEach(nested.children) { c in
NestedView(nested: c)
}
}
}
}


struct Test: View {
@ObservedObject var model: Model0 = Model0(nested: Nested(name: "Parent" ,children: [Nested(name: "Child", children: [])]))

var body: some View {
VStack {
Button(action: {
self.model.update()
}) {
Text("Update")
}
NestedView(nested: model.nested)
}
}
}

最佳答案

如果你决定制作引用类型的模型,那么你需要将它们都设置为可观察的,这样每个级别都可以更新相应的 View 。而且,当然,每个级别模型都有单独的 View 。
考虑到上述情况,这里是一个解决方案。使用 Xcode 12/iOS 14 测试。
仅修改部分:

class Nested: ObservableObject, Identifiable {
var id: UUID = UUID()
@Published var name: String
@Published var children:[Nested]

init(name: String, children:[Nested]) {
self.children = children
self.name = name
}
}

struct NestedView: View {
@ObservedObject var nested: Nested

var body: some View {
VStack {
Text(nested.name)

ForEach(nested.children) { c in
NestedView(nested: c)
}
}
}
}

关于swift - 在 SwiftUI 中更新树结构的 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63488447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com