首页 > 解决方案 > 我使用 dislousreGroup 作为递归,但视图更新无法正常工作。有什么办法吗?

问题描述

在此处输入图像描述

如果在折叠后更改数据,则视图被重用并绘制得很奇怪。

在 swiftUI 中重用视图似乎会产生这些结果。

我可以控制视图的重用吗?还是有其他方法?

跟身份证有关系吗?

下面是实现这一点的代码。

import SwiftUI

@main
struct TestApp: App {
    var item: Item = dummyItems
    var item2: Item = dummyItems2

    @State var isChange: Bool = true
    
    var body: some Scene {
        WindowGroup {
            VStack {
                List {
                    if isChange {
                        ContentView(item: item)
                    } else {
                        ContentView(item: item2)

                    }
                }
                Button("change") {
                    isChange.toggle()
                }
            }
        }
    }
}

import SwiftUI

struct ContentView: View {
    let item: Item
    
    init(item: Item) {
        self.item = item
    }
    
    var body: some View {
        ForEach(item.children) { item in
            if item.children.isEmpty {
                Text("\(item.title)")
            } else {
                DisclosureGroup(
                    isExpanded: item.$isExpanded,
                    content: {
                        ContentView(item: item)
                    },
                    label: { Text("\(item.title)") }
                )
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    
    static var previews: some View {
        let item: Item = dummyItems
        ContentView(item: item)
    }
}

struct Item: Identifiable {
    var id: UUID = UUID()
    
    @Binding var isExpanded: Bool
    var title: String = "title"
    var children: [Item] = []
    
    init(title: String,
         children: [Item]) {
        self.title = title
        self.children = children
        self._isExpanded = .constant(true)
    }
}

let dummyItems2 = Item(title: "root",
                      children: [
                        Item(title: "1",
                             children: [
                                Item(title: "1-1",
                                     children: [
                                        Item(title: "1-1-1",
                                             children: [])]
                                ),
                                Item(title: "1-2",
                                     children: [
                                        Item(title: "1-2-1",
                                             children: []),
                                        Item(title: "1-2-2",
                                             children: [])]
                                )
                             ]),
                        Item(title: "2",
                             children: [
                                Item(title: "2-1",
                                     children: [
                                        Item(title: "2-1-1",
                                             children: [])]
                                ),
                                Item(title: "2-2",
                                     children: [
                                        Item(title: "2-2-1",
                                             children: [])]
                                ),
                                Item(title: "2-3",
                                     children: [
                                        Item(title: "2-3-1",
                                             children: [])]
                                ),
                             ]),
                        Item(title: "3",
                             children: [
                                Item(title: "3-1",
                                     children: [
                                        Item(title: "3-1-1",
                                             children: []),
                                        Item(title: "3-1-2",
                                             children: []),
                                        Item(title: "3-1-3",
                                             children: [])]
                                ),
                                Item(title: "3-2",
                                     children: [
                                        Item(title: "3-1-1",
                                             children: [])]
                                ),
                                Item(title: "3-3",
                                     children: [
                                        Item(title: "3-1-1",
                                             children: [])]
                                )
                             ])
                        
                      ])



let dummyItems = Item(title: "root",
                      children: [
                        Item(title: "1",
                             children: [
                                Item(title: "1-1",
                                     children: [
                                        Item(title: "1-1-1",
                                             children: [])]
                                ),
                                Item(title: "1-2",
                                     children: [
                                        Item(title: "1-2-1",
                                             children: []),
                                        Item(title: "1-2-2",
                                             children: [])]
                                )
                             ]),
                        Item(title: "2",
                             children: [
                                Item(title: "2-1",
                                     children: [
                                        Item(title: "2-1-1",
                                             children: [])]
                                ),
                             ]),
                        Item(title: "3",
                             children: [
                                Item(title: "3-1",
                                     children: [
                                        Item(title: "3-1-1",
                                             children: []),
                                        Item(title: "3-1-2",
                                             children: []),
                                        Item(title: "3-1-3",
                                             children: [])]
                                ),
                                Item(title: "3-2",
                                     children: [
                                        Item(title: "3-1-1",
                                             children: [])]
                                ),
                                Item(title: "3-3",
                                     children: [
                                        Item(title: "3-1-1",
                                             children: [])]
                                )
                             ])
                        
                      ])

任何帮助将不胜感激。

标签: recursionviewswiftuiupdatesdisclosure

解决方案


尝试以下

List {
    if isChange {
        ContentView(item: item)
    } else {
        ContentView(item: item2)

    }
}
.id(isChange)    // << here !!

推荐阅读