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

ni65a41a  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(78)

我正在尝试在编辑模式下重新排列List行。
快速总结:我不希望像Second这样的DisclosureGroup行被插入到它们自己的子级层次结构中。如果他们进入任何其他层次/级别也没关系。
下面是一些示例代码:

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))
    }
}

这就是行注解的意思:

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

拖动DisclosureGroup行时,可以执行以下操作之一:
1.* * 所有的孩子都应该被拖走。
1.不应将此DisclosureGroup行插入到它自己的任何子行之间。
我们现在只关注视觉UI,因此onMove(perform:)方法还没有完成。
| 个别法|分组法|
| - -----|- -----|
|

|

|
注意事项:

      • 个别方法**:Second行可以移动到与Item 3Item 4相同的层,这是不允许的。但是,它允许Item 3Item 4介于Item 1Item 2之间。
      • 分组方式**:Item 3Item 4被“锁定”到它们自己的级别-它们之间不能插入任何视图,也不能移动到与Item 1Item 2相同的级别(坏)。但是,在这种情况下,Second不能移动到它自己的子级层次结构中(良好)。

我如何解决这个问题,所以我基本上有'individual方法',但像Second这样的DisclosureGroup行不能插入到它们自己的子层次结构中?如果他们进入任何其他层次/级别也没关系。
我意识到这是一个相当复杂的问题-所以尝试自己的代码,并观看GIF来理解。
如果它运行正常,我也会接受UIKit解决方案(比如UICollectionView?).

qmelpv7a

qmelpv7a1#

不幸的是,.onMove目前不能处理嵌套的ForEach。我也一直在研究this,我发现的唯一一件事就是扁平化数组,并编写函数来处理嵌套项的移动:


相关问题