我们如何在SwiftUI中访问列表的披露组?

我们如何在SwiftUI中访问列表的披露组?,swiftui,swiftui-list,Swiftui,Swiftui List,我使用此代码在Swiftui2.0和macOs 10.15.7中的列表上显示我的父母和孩子数据 默认情况下,我的父母处于崩溃状态!我喜欢强迫他们中的一些人用我的按钮动作扩展,我有那个按钮。有人知道如何解决这个问题吗 这是我的代码: import SwiftUI struct staticData: Identifiable { let id = UUID() var NameOfItem : String var dy

我使用此代码在Swiftui2.0和macOs 10.15.7中的列表上显示我的父母和孩子数据

默认情况下,我的父母处于崩溃状态!我喜欢强迫他们中的一些人用我的按钮动作扩展,我有那个按钮。有人知道如何解决这个问题吗

这是我的代码:

import SwiftUI

struct staticData: Identifiable
{
    let id                  = UUID()
    var NameOfItem          : String
    var dynamicData         : [staticData]?
}

let Child1 = staticData(NameOfItem: "Child1")
let Child2 = staticData(NameOfItem: "Child2")
let Child3 = staticData(NameOfItem: "Child3")

let parent1 = staticData(NameOfItem: "parent1", dynamicData: [Child1, Child2, Child3])
let parent2 = staticData(NameOfItem: "parent2", dynamicData: [Child1, Child2])
let parent3 = staticData(NameOfItem: "parent3")

struct ContentView: View
{
    
    
    @State var items: [staticData] = [parent1, parent2, parent3]

    var body: some View
    {
        VStack
        {
            HStack
            {
                
                Spacer()
                
                Button("Expand parent1")
                {
                    
                }
                
                Spacer()
                
                Button("Collapse parent1")
                {
                    
                }
                
                Spacer()
            }
            
            List(items, children: \.dynamicData) { row in
                
                Text(row.NameOfItem)
                    .onTapGesture
                    {
                        print(row.id)
                        print(row.NameOfItem)
                        print(row.dynamicData?.count ?? 0)
                    }
            }
        }
    }
}

下面是一个可能方法的演示。(当然,您最好在较小的子视图上进行分离,如HeaderView、ExpandableRowView、FlatRowView等)


下面是一个可能方法的演示。(当然,您最好在较小的子视图上进行分离,如HeaderView、ExpandableRowView、FlatRowView等)


谢谢你的回答,你就像我一样编码,我也使用了ForEach和DisclosureGroup!我想使用设计并嵌入在“List(items,children:\.dynamicData)”中的DisclosureGroup,如果您运行我的代码,您将看到DisclosureGroup自动弹出,我想控制DisclosureGroup!否则你的代码工作得很好,你有没有从列表中控制DisclosureGroup的想法?有了这个列表构造函数,DisclosureGroup是代表你私自创建的,所以你无法控制它。我想是的!那不好!我希望它得到修复,然后我们可以使用@bindings谢谢你的回答,你就像我一样编码,我还使用了ForEach和dispositiongroup!我想使用设计并嵌入在“List(items,children:\.dynamicData)”中的DisclosureGroup,如果您运行我的代码,您将看到DisclosureGroup自动弹出,我想控制DisclosureGroup!否则你的代码工作得很好,你有没有从列表中控制DisclosureGroup的想法?有了这个列表构造函数,DisclosureGroup是代表你私自创建的,所以你无法控制它。我想是的!那不好!我希望它得到修复,然后我们可以使用@Binding
struct staticData: Identifiable, Hashable
{
    let id                  = UUID()
    var NameOfItem          : String
    var dynamicData         : [staticData]?
}

let Child1 = staticData(NameOfItem: "Child1")
let Child2 = staticData(NameOfItem: "Child2")
let Child3 = staticData(NameOfItem: "Child3")

let parent1 = staticData(NameOfItem: "parent1", dynamicData: [Child1, Child2, Child3])
let parent2 = staticData(NameOfItem: "parent2", dynamicData: [Child1, Child2])
let parent3 = staticData(NameOfItem: "parent3")


struct ContentView: View
{
    @State var items: [staticData] = [parent1, parent2, parent3]
    
    @State var expanded = false
    
    var body: some View
    {
        VStack
        {
            HStack
            {
                Spacer()
                
                Button("Expand parent1")
                {
                    withAnimation { self.expanded = true }
                }
                
                Spacer()
                
                Button("Collapse parent1")
                {
                    withAnimation { self.expanded = false }
                }
                
                Spacer()
            }
            
            List {
                ForEach(Array(items.enumerated()), id: \.1) { i, item in
                    if i == 0 {
                        DisclosureGroup(isExpanded: $expanded )
                        {
                            ForEach(item.dynamicData ?? []) { child in
                                Text(child.NameOfItem)
                            }
                        } label: {
                            Text(item.NameOfItem)
                                .onTapGesture
                                {
                                    print(item.id)
                                    print(item.NameOfItem)
                                    print(item.dynamicData?.count ?? 0)
                                }
                        }
                    } else if item.dynamicData != nil {
                        DisclosureGroup
                        {
                            ForEach(item.dynamicData ?? []) { child in
                                Text(child.NameOfItem)
                            }
                        } label: {
                            Text(item.NameOfItem)
                                .onTapGesture
                                {
                                    print(item.id)
                                    print(item.NameOfItem)
                                    print(item.dynamicData?.count ?? 0)
                                }
                        }
                    } else {
                        Text(item.NameOfItem)
                    }
                }
            }
        }
    }
}