Ios 如何在应用程序启动时保持包含子项的SwiftUI列表的展开/折叠状态?

Ios 如何在应用程序启动时保持包含子项的SwiftUI列表的展开/折叠状态?,ios,swift,macos,swiftui,Ios,Swift,Macos,Swiftui,“我的视图”显示一个文件系统树,其当前代码如下所示: struct FileItem:可散列、可识别、可自定义{ 变量id:Self{Self} 变量名称:String 变量子项:[FileItem]? 变量说明:字符串{ 交换孩子{ 无案例: return“根据用例的不同,这实际上应该使用Scenestrage来完成,这样每个窗口的状态都会得到保留,而不是整个应用程序(使用用户默认值或AppStorage) 您可以通过为列表中的文件项创建视图来完成此操作。下面的实现假定文件项id在同一文件的两

“我的视图”显示一个文件系统树,其当前代码如下所示:

struct FileItem:可散列、可识别、可自定义{
变量id:Self{Self}
变量名称:String
变量子项:[FileItem]?
变量说明:字符串{
交换孩子{
无案例:

return“根据用例的不同,这实际上应该使用Scenestrage来完成,这样每个窗口的状态都会得到保留,而不是整个应用程序(使用用户默认值或AppStorage)

您可以通过为列表中的文件项创建视图来完成此操作。下面的实现假定文件项id在同一文件的两次启动之间保持不变,并且在不同文件之间是唯一的

struct FileItemView: View {
    let item: FileItem
    let expanded: SceneStorage<Bool>
    init(_ item: FileItem) {
        self.item = item
        self.expanded = SceneStorage(wrappedValue: false, "FileItemView.expanded.\(item.id)")
    }
    
    var body: some View {
        HStack {
            Text(item.description)
            Button(expanded.wrappedValue ? "expanded" : "collapsed") {
                expanded.wrappedValue.toggle()
            }
            Spacer()
        }
        .padding(2)
    }
}

struct FileTree: View {
  let root: FileItem
  var body: some View {
    List(
      [root],
      children: \.children
    ) { item in
      FileItemView(item)
    }
    .listStyle(SidebarListStyle())
  }
}
struct FileItemView:View{
let item:FileItem
让我们来看看:风景画
init(uItem:FileItem){
self.item=项目
self.expanded=SceneStorage(wrappedValue:false,“FileItemView.expanded.\(item.id)”)
}
var body:一些观点{
HStack{
文本(项目说明)
按钮(expanded.wrappedValue?“expanded”:“collapsed”){
expanded.wrappedValue.toggle()
}
垫片()
}
.填充(2)
}
}
结构文件树:视图{
let root:FileItem
var body:一些观点{
名单(
[根],
儿童:\.儿童
){中的项目
FileItemView(项目)
}
.listStyle(SidebarListStyle())
}
}

您需要自己完成这项工作,例如,在UserDefault中存储扩展路径,并使用DisclosureGroup以编程方式在视图中进行处理(例如,for DisclosureGroup在中)在您的示例中,文件夹项的“代码”子项在折叠或展开时不会隐藏或显示。您在此处引入了一个附加的
按钮
,该按钮在切换时不会删除或添加子项,而在问题中显示的原始示例中,标准的“公开”按钮会执行此操作。@MaxDesiatov我只是这样做的一个示例您可以看到,该值可以更改,并且可以通过场景启动来存储和检索。问题是关于保存状态问题具体是关于保存
列表
披露项和展开/折叠子项的状态。您的回答没有阐明如何保存子项展开/折叠状态。我可能会感到困惑然后。我的回答会保留特定于场景的列表中每个文件项的展开/折叠状态,并在重新加载场景时正确地重新创建。我不确定这与您所问的有什么不同。“展开”或“折叠”"表示给定项的子项分别显示或隐藏,并且公开三角形箭头更改其旋转状态。答案中的代码既不显示也不隐藏,它不显示/隐藏处于展开/折叠状态的项的子项,也不旋转公开箭头。它唯一更改的是按钮的文本,而该按钮未显示原始问题代码中的ent。