问题描述
更新
我正在尝试在 List
(SwiftUI
) 中使用分层 List( tree,children:)
视图。我发现如果第一个列表元素没有子元素,则只显示层次结构的顶层。对我来说,这看起来像是 SwiftUI 中的一个错误。我想知道是否有人知道一个好的修复方法。
[这是我问题的更好版本,使用相同的 struct
类型和相同的数组元素]
@main
struct bug_reportApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct FileItem: Hashable,Identifiable,customstringconvertible {
var id: Self { self }
var name: String
var children: [FileItem]? = nil
var description: String {
return name
}
}
let tree0: [FileItem] = [
FileItem(name: "users",children:
[FileItem(name: "user1234",children:
[FileItem(name: "Photos",children:
[FileItem(name: "photo001.jpg"),FileItem(name: "photo002.jpg")]),FileItem(name: "Movies",children:
[FileItem(name: "movie001.mp4")]),FileItem(name: "Documents")
]),FileItem(name: "newuser",children:
[FileItem(name: "Documents",children: [])
])
]),FileItem(name: "private",children: nil)
]
let tree1 = [tree0[1],tree0[0]]
let tree2 = [FileItem(name: "private",children: []),tree0[0]]
struct ContentView: View {
var body: some View {
HStack{
vstack{
Text("Works").font(.headline)
List(tree0,children: \.children) { item in
Text(item.description)
}
}
vstack{
Text("First element has empty .children").font(.headline)
List(tree2,children: \.children) { item in
Text(item.description)
}
}
vstack{
Text("First element has nil .children").font(.headline)
List(tree1,children: \.children) { item in
Text(item.description)
}
}
}
}
}
这是一个带注释的屏幕截图,突出显示缺少的树扩展箭头在哪里/应该在哪里。
原始问题
我正在尝试在 List
(SwiftUI
) 中使用分层 List( tree,children:)
视图。
我不明白为什么我这里的简单示例只显示 3 个顶级 3 项,没有小箭头来展开列表元素 #2 下的子列表。
我可以剪切和粘贴外观非常相似的示例(到同一个项目、同一个文件中)并且它们确实有效……但我看不出区别!
我的代码不起作用:
import SwiftUI
struct TreeIndexNode: Hashable,customstringconvertible {
var id: Int
var children: [TreeIndexNode]? = nil
var description: String {
return String("\(id)")
}
}
struct ContentView: View {
let tree: [TreeIndexNode] = [ TreeIndexNode(id: 1),TreeIndexNode(id: 2,children: [
TreeIndexNode(id: 3),TreeIndexNode(id: 4),]),TreeIndexNode(id: 8),]
var body: some View {
List( tree,children: \.children) { row in
Text(row.description)
}
}
}
但如果我从 Apple Developer 页面将其切换到此示例,它会按预期工作:
struct ContentView: View {
struct FileItem: Hashable,customstringconvertible {
var id: Self { self }
var name: String
var children: [FileItem]? = nil
var description: String {
switch children {
case nil:
return "? \(name)"
case .some(let children):
return children.isEmpty ? "? \(name)" : "? \(name)"
}
}
}
let fileHierarchyData: [FileItem] = [
FileItem(name: "users",children:
[FileItem(name: "user1234",children:
[FileItem(name: "Photos",children:
[FileItem(name: "photo001.jpg"),children:
[FileItem(name: "movie001.mp4")]),FileItem(name: "Documents",children: [])
]),children:
[FileItem(name: "Documents",children: [])
])
]),children: nil)
]
var body: some View {
List(fileHierarchyData,children: \.children) { item in
Text(item.description)
}
}
}
我从 Xcode 12.4“多平台”项目模板开始。这是它在 MacOS 上的样子:
Screen shot of non-working MacOS build of my code above
当我为 iOS 构建时,它确实按预期工作:
my code above in iOS simulator