SwiftUI - 从路径列表创建文件系统树视图

问题描述 投票:0回答:1

我有一个路径列表,例如从“ls -R”标准输出解析为数组的列表,如何用它创建一个非常简单的树视图列表?

我仍在快速学习,我不知道如何创建用子项填充列表视图所需的数据结构。

谢谢

更新(04/10/23)

我感谢无缘无故的反对票..

最终我想出了这个解决方案:

为要在树中显示的项目创建一个类

class TreeItem: Identifiable{
    
    let Id = UUID()
    let Name: String
    var isExpanded = false
    var Children: [TreeItem] = [] //for subentries

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

为树创建一个视图

struct TreeItemView: View {
    @State var item: TreeItem

    var body: some View {
        DisclosureGroup(
            isExpanded: $item.isExpanded,
            content: {
                if !item.Children.isEmpty {             
                    ForEach(item.Children) { child in
                        if (child.Children.isEmpty){
                            Text(child.Name))
                        }else{
                            TreeItemView(item: child)    
                        }
                    }
                }
            },
            label: {
                Text(item.Name)
            }
        )
    }
}

这是从路径列表中返回 TreeItem 类型的嵌套数组的函数

func parsePaths(PathList: [String]) -> [TreeItem]{
    let rootFolder = TreeItem(name: "root") //create startpoint
    
    list.removeAll { $0.isEmpty } //remove empty lines

    for path in PathList{

        let components = path.split(separator: "/").map(String.init) //split path in components by '/''
        var currentFolder = rootFolder //set root folder

        for component in components {

            if let existingFolder = currentFolder.Children.first(where: { $0.name == component }) { 
                currentFolder = existingFolder
            } else {
                let newFolder = TreeItem(name: component)
                currentFolder.Children.append(newFolder)
                currentFolder = newFolder 
            }
            
        }
    }

    return rootFolder.Children
}

这是带有一些示例数据的主视图:

struct ContentView: View {

    @State var content:[TreeItem] = [] //initialize the content var

    var body: some View {
        Button("Show"){
            content = parsePaths(PathList: [
                "/FolderA/file.a",
                "/FolderA/FolderAA/file.aa",
                "/FolderB/FolderBB/FolderBBB/file.bbb",
                "/FolderB/file.bbb",
                "/FolderA/file.a1"
            ])
        }
        List{
            ForEach(content, id: \.Id){item in
                    TreeItemView(item: item)
                }
        }
    }
}
swift listview swiftui directory treeview
1个回答
0
投票

答案是我对上面原始问题的最后更新^

© www.soinside.com 2019 - 2024. All rights reserved.