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

Posted

技术标签:

【中文标题】SwiftUI List() 在 macOS 上不显示 .children【英文标题】:SwiftUI List() doesn't show .children on macOS 【发布时间】:2021-04-07 15:02:16 【问题描述】:

更新

我正在尝试在SwiftUI (List( tree, children:)) 中使用分层List 视图。我发现如果第一个列表元素没有子元素,则只显示层次结构的顶层。对我来说,这看起来像是 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)
                
            
          
        
    

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

原始问题

我正在尝试使用SwiftUI (List( tree, children:)) 中的分层List 视图。

我不明白为什么我这里的简单示例只显示 3 个*** 3 项,没有小箭头来展开列表元素 #2 下的子列表。

我可以剪切和粘贴外观非常相似的示例(到同一个项目、同一个文件中),它们确实有效……但我看不出区别!

我的代码不起作用:


import SwiftUI

struct TreeIndexNode: Hashable, Identifiable, 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 开发者页面切换到此示例,它会按预期工作:


struct ContentView: View 
    struct FileItem: Hashable, Identifiable, 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"),
             FileItem(name: "photo002.jpg")]),
           FileItem(name: "Movies", children:
             [FileItem(name: "movie001.mp4")]),
              FileItem(name: "Documents", children: [])
          ]),
         FileItem(name: "newuser", children:
           [FileItem(name: "Documents", children: [])
           ])
        ]),
        FileItem(name: "private", 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

【问题讨论】:

不确定您要寻求解决方案的问题是什么 - 刚刚尝试了来自空白 SwiftUI 项目的两个 sn-ps 代码 - 两个 sn-ps 都适用于每个 MacOS 和 iOS。跨度> 我想知道它是 Xcode 还是操作系统版本特定的东西。我把事情缩小了一点。我将使用新信息编辑帖子:我发现如果列表顶层的第一项没有子项,则它不会将其显示为分层列表。 【参考方案1】:

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

您可以尝试重新启动/更新 XCode。一个奇怪的地方是,箭头在上面的截图中出现在右边,而在帖子中它们出现在左边。您是否在项目中添加了某些语言/区域设置/格式设置但未包含在上述 sn-p 中?

顺便说一句,编写的代码已将标签交换为儿童 nil 与空儿童。澄清一下,tree1 是有 nil 孩子的那个,而 tree2 有空孩子。上面的截图运行了 OP 的原始未修改代码。

【讨论】:

我相信我拥有最新的 MacOS 和 Xcode [分别为 11.2.3 和版本 12.4 (12D4e)] rohanphadte:关于 nil 和 empty 被切换,你是对的。谢谢!并感谢您的建议。我相信我拥有最新的 MacOS 和 Xcode [分别为 11.2.3 和版本 12.4 (12D4e)] 重新启动 Xcode 或将此代码剪切并粘贴到新的 Xcode 项目中都没有任何区别。据我所知,我没有设置任何语言、区域设置或格式设置。这可能与 Big Sur / Mac Catalyst 有关吗?

以上是关于SwiftUI List() 在 macOS 上不显示 .children的主要内容,如果未能解决你的问题,请参考以下文章

Swiftui [BUG] NavigationView 和 List 仅在 iPad 模拟器上不显示

SwiftUI List with Divider 但在 MacOS 中没有额外的 Insets

SwiftUI List 如何识别在 macOS 上选择了哪些项目

macOS 上的 SwiftUI:如何为 onDelete 启用 UI(从列表中删除)

带有选择器的 SwiftUI 列表:选择不适用于自定义类型(macOS)

SwiftUI不借助ScrollViewReader和ScrollViewProxy实现List自动滚动到底部