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行时,需要满足以下两个条件之一:
- 所有子元素随该
DisclosureGroup一起被拖动。 - 该
DisclosureGroup行不允许被插入到自身任意子元素之间。
目前只关注视觉UI表现,因此onMove(perform:)方法暂未实现完整逻辑。
两种写法效果对比
| 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
相关产品推荐
相关产品推荐



