微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI List() 在 macOS 上不显示 .children

如何解决SwiftUI List() 在 macOS 上不显示 .children

更新

我正在尝试在 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)
                }
            }
          
        }
    }
}

这是一个带注释的屏幕截图,突出显示缺少的树扩展箭头在哪里/应该在哪里。

screenshot

原始问题

我正在尝试在 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

解决方法

您的代码在 MacOS 上按预期工作。所有三个列表都显示了正确的可扩展子项。

enter image description here

您可以尝试重新启动/更新 XCode。奇怪的一件事是,箭头出现在上面屏幕截图的右侧,而它们出现在帖子的左侧。您是否在项目中添加了某些语言/区域设置/格式设置,但未包含在上面的代码段中?

顺便说一句,所写的代码交换了孩子 nil 和空孩子的标签。澄清一下,tree1 是一个有 nil 个孩子而 tree2 有空孩子的人。上面的截图运行的是 OP 的原始未修改代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。