Adding headers to OutlineGroup / DisclosureGroup

跟風遠走 提交于 2021-02-08 10:47:39

问题


I'm using SwiftUI 2.0, and I need a way to add a header to an OutlineGroup or DisclosureGroup, similar to headers in List sections. Is there a way to do this?


回答1:


You can use separate Sections to create the headers (and, optionally, footers).

import SwiftUI

struct Node : Identifiable {
    let id = UUID()
    let name: String
    let children: [Node]?
}

struct SectionedOutlineView: View {
    var body: some View {
        List(selection: $selection) {
            Section(header: Label("Nodes 1", systemImage: "sparkle")) {
                OutlineGroup(nodes1, children: \.children) { node in
                    Label(node.name, systemImage: "shield")
                }
            }

            Section(header: Label("Nodes 2", systemImage: "rosette")) {
                OutlineGroup(nodes2, children: \.children) { node in
                    Label(node.name, systemImage: "folder")
                }
            }
        }
        .listStyle(SidebarListStyle())
    }

    @State var nodes1 = [
        Node(name: "Layer 1", children: [
            Node(name: "Layer 1-1", children: [
                Node(name: "Layer 1-1-1", children: nil),
                Node(name: "Layer 1-1-2", children: nil),
            ]),
            Node(name: "Layer 1-2", children: [
                Node(name: "Layer 1-2-1", children: nil),
                Node(name: "Layer 1-2-2", children: nil),
                Node(name: "Layer 1-2-3", children: nil),
            ]),
            Node(name: "Layer 1-3", children: nil),
        ]),
        Node(name: "Layer 2", children: [
            Node(name: "Layer 2-1", children: [
            ]),
            Node(name: "Layer 2-2", children: [
            ]),
            Node(name: "Layer 2-3", children: [
            ]),
        ])
    ]

    @State var nodes2 = [
        Node(name: "Layer 1", children: [
            Node(name: "Layer 1-1", children: [
                Node(name: "Layer 1-1-1", children: nil),
                Node(name: "Layer 1-1-2", children: nil),
            ]),
            Node(name: "Layer 1-2", children: [
                Node(name: "Layer 1-2-1", children: nil),
                Node(name: "Layer 1-2-2", children: nil),
                Node(name: "Layer 1-2-3", children: nil),
            ]),
            Node(name: "Layer 1-3", children: [
            ]),
        ]),
        Node(name: "Layer 2", children: [
            Node(name: "Layer 2-1", children: [
            ]),
            Node(name: "Layer 2-2", children: [
                Node(name: "Layer 2-2-1", children: nil),
                Node(name: "Layer 2-2-2", children: nil),
                Node(name: "Layer 2-2-3", children: nil),
            ]),
            Node(name: "Layer 2-3", children: [
            ]),
        ])
    ]

    @State var selection = Set<Node.ID>()
}


来源:https://stackoverflow.com/questions/63291987/adding-headers-to-outlinegroup-disclosuregroup

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!