我有一个路径列表,例如从“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)
}
}
}
}
答案是我对上面原始问题的最后更新^