在编辑模式下使用 DisclosureGroup 重新排列列表

Geo*_*e_E 7 swift swiftui swiftui-list

我试图List在编辑模式下重新排列行。

快速摘要:我希望DisclosureGroupSecond不被插入到它们自己的子层次结构中。如果他们进入任何其他层次结构/级别也没关系。

下面是一些示例代码:

struct ContentView: View {
    var body: some View {
        List {
            ForEach(0 ..< 1) { _ in
                DisclosureGroup("First", isExpanded: .constant(true)) {
                    ForEach(0 ..< 1) { _ in
                        Text("Item 1")
                        Text("Item 2")

                        DisclosureGroup("Second", isExpanded: .constant(true)) {
                            // Individual
                            Text("Item 3")
                            Text("Item 4")

                            // Grouped
//                            ForEach(0 ..< 1) { _ in
//                                Text("Item 3")
//                                Text("Item 4")
//                            }
                        }
                    }
                }
            }
            .onMove(perform: { _, _ in })
        }
        .listStyle(.sidebar)
        .environment(\.editMode, .constant(.active))
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是行注释的含义:

  • individual:这将允许行在当前级别内自由移动,但也意味着行DisclosureGroup可以在这些元素之间移动(不需要)
  • 分组:这会将这些视图“锁定”到该层次结构级别。例如Item 3Item 4可以交换行,但是这些行不能再拖动到其他位置,例如 和Item 1之间Item 2

DisclosureGroup拖动一行时,可以:

  1. 所有的孩子都应该被拖走。
  2. DisclosureGroup行不应插入到它自己的子行之间。

我们现在纯粹专注于视觉 UI,因此该onMove(perform:)方法尚未完成。

个别方法 分组法
个人 分组的

笔记:

  • 个别方法:可以将该行移动到与和Second相同的层,这是不允许的。然而,它确实允许和位于和之间。Item 3Item 4Item 3Item 4Item 1Item 2

  • 分组方法Item 3Item 4被“锁定”到自己的级别 - 之间不能插入视图,也不能移动到与Item 1和相同的级别Item 2(不好)。但是,在这种情况下,Second无法进入其自己的子级层次结构(好)。

我该如何解决这个问题,所以我基本上有“单独的方法”,但是DisclosureGroup像这样的行Second无法插入到它们自己的子层次结构中?如果他们进入任何其他层次结构/级别也没关系。

我意识到这是一个相当复杂的问题 - 所以请亲自尝试代码并观看 GIF 来理解。

如果它运行正常,我也会接受 UIKit 解决方案(例如使用UICollectionView?)。

小智 -1

不幸的是,.onMove目前不适用于嵌套的 ForEach。我也一直在研究这个问题,我发现的唯一的事情就是展平数组,并编写用于处理嵌套项目移动的函数:

扁平化列表 GIF