ios - SwiftUI 中默认展开的 List 或 OutlineGroup

标签 ios macos swiftui ios14 macos-big-sur

使用 SwiftUI 中的 List 或 OutlineGroup 如何在创建 View 时使其部分(或全部)分支默认展开。这似乎可以通过具有绑定(bind)的 DisclosureGroup 实现。
这对于恢复状态或自定义 View 以进行演示很有用。

最佳答案

OutlineGroup 的可重复使用版本,其中可扩展性受到控制。

import SwiftUI

struct NodeOutlineGroup<Node>: View where Node: Hashable, Node: Identifiable, Node: CustomStringConvertible{
    let node: Node
    let childKeyPath: KeyPath<Node, [Node]?>
    @State var isExpanded: Bool = true

    var body: some View {
        if node[keyPath: childKeyPath] != nil {
            DisclosureGroup(
                isExpanded: $isExpanded,
                content: {
                    if isExpanded {
                        ForEach(node[keyPath: childKeyPath]!) { childNode in
                            NodeOutlineGroup(node: childNode, childKeyPath: childKeyPath, isExpanded: isExpanded)
                        }
                    }
                },
                label: { Text(node.description) })
        } else {
            Text(node.description)
        }
    }
}

struct ContentView: View {
    var body: some View {
        List {
            NodeOutlineGroup(node: data, childKeyPath: \.children, isExpanded: true)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

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 data =
  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: [])
       ])
    ])

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

关于ios - SwiftUI 中默认展开的 List 或 OutlineGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62832809/

相关文章:

ios - 社交网络集成如何与ios一起工作

SwiftUI = ObservableObject 作为类的选择

node.js - 现在通过 brew 使用 npm 安装 Node 的方式是什么

swift - some View 作为方法/初始化器的输入参数

ios - Swift 无法更新父 View

ios - 在 Swift 中 segue 之后从堆栈中移除(删除) View /viewController 的正确方法

iphone - iOS:从另一个 View 将新单元格添加到表格 View

ios - 如何将 xib 文件设置为 initialViewController?

macos - 在 Mac OS 10.8(64 位)上编译 SQLCipher

objective-c - 针对未绘制的颜色进行子像素渲染