You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI编辑模式下List行重排,禁止DisclosureGroup插入自身子层级

编辑模式下调整List行顺序限制DisclosureGroup插入自身子层级的实现问题

我想要在编辑模式下调整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))
    }
}

代码注释说明

  • Individual写法:允许行在当前层级自由移动,但也会导致DisclosureGroup行可以在自身子元素之间移动,不符合需求。
  • Grouped写法:会将对应视图“锁定”在当前层级,比如Item 3和Item 4可以互相交换顺序,但无法被拖动到Item 1和Item 2之间的位置。

拖动规则要求

拖动DisclosureGroup行时,需要满足以下两个条件之一:

  1. 所有子元素随该DisclosureGroup一起被拖动。
  2. 该DisclosureGroup行不允许被插入到自身任意子元素之间。

目前只关注视觉UI表现,因此onMove(perform:)方法暂未实现完整逻辑。

两种写法效果对比

Individual写法效果Grouped写法效果
individual写法效果grouped写法效果

注意事项

  • Individual写法:Second行可以被移动到和Item 3、Item 4同一层级,这是不允许的。但该写法支持Item 3、Item 4移动到Item 1和Item 2之间的位置。
  • Grouped写法:Item 3和Item 4被“锁定”在自身层级,既没有视图可以插入到二者之间,二者也无法移动到和Item 1、Item 2同一层级(不符合需求)。但该写法下Second无法移动到自身子层级中(符合需求)。

问题

请问如何解决该问题,实现保留Individual写法的能力的同时,禁止Second这类DisclosureGroup行插入到自身子层级中,允许其插入到其他任意层级/结构中?
也接受UIKit实现方案(比如基于UICollectionView的方案)。


内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:06:05