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

SwiftUI List仅在点击EditButton时启用重排功能的实现问题

SwiftUI List 仅在编辑模式启用时允许重排的正确实现

你之前的代码问题出在编辑状态的判断逻辑上——editMode是Binding<EditMode>?类型,直接和.active比较是错误的,必须通过wrappedValue获取当前实际的编辑状态。

下面是修正后的完整实现方案:

  1. 保留环境变量的声明:
@Environment(\.editMode) private var editMode
  1. 把重排逻辑抽成单独的函数(也可以直接写在闭包里,抽出来更易维护):
private func reorderItems(from source: IndexSet, to destination: Int) {
    // 在这里编写你的数据重排逻辑,例如:
    // yourDataSourceArray.move(fromOffsets: source, toOffset: destination)
}
  1. 给List添加onMove修饰符时,正确判断编辑状态:
List {
    // 你的列表元素内容
}
.toolbar {
    EditButton()
}
.onMove(perform: editMode?.wrappedValue == .active ? reorderItems : nil)

原理说明:当onMove的perform参数传入nil时,List会自动禁用重排功能;只有当编辑模式激活(点击EditButton切换到编辑状态)时,才会传入重排逻辑函数,开启拖拽重排权限。

另外要确保你的数据源数组是用@State、@Binding或@Observable等可观察属性包装的,这样数据重排后才能正确触发视图更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:43:22