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

SwiftUI列表编辑模式下新插入记录缺失选项按钮问题咨询

SwiftUI List编辑态新增行不显示选择按钮修复

复现步骤

按以下流程操作即可触发异常:

  • 多次点击「Insert」按钮(示例操作点击3次)插入多条记录
  • 从右向左滑动单条记录,执行滑动删除操作
  • 点击「Edit」按钮切换到编辑模式
  • 再次点击「Insert」按钮插入一条新记录

异常表现

操作完成后,编辑模式下原有留存的记录可正常显示空心选择圆圈的选项按钮,但最后新插入的记录不显示该按钮。实际所有记录均支持点击选中,问题原因为列表复用了非编辑模式下已删除记录的视图,复用的视图未同步刷新编辑态的选择按钮显示状态。

原始问题代码

struct ListEditModeSubviewUpdateTest: View {
    @State private var data = [Int]()
    @State private var editMode = EditMode.inactive
    @State private var selects = Set<Int>()
    @State private var base = 0
    
    var body: some View{
        VStack{
            Button {
                editMode = editMode.isEditing ? .inactive : .active
            } label: {
                Text(editMode.isEditing ? "Done" : "Edit")
            }
            
            Button {
                base += 1
                data.append(base)
            } label: {
                Text("Insert")
            }
            
            List(selection: $selects){
                ForEach(data, id:\.self){item in
                    Text(String(item))
                }
                .onDelete{
                    data.remove(atOffsets: $0)
                }
            }
        }
        .environment(\.editMode, $editMode)
    }
}

修复方法

给List组件添加绑定当前编辑模式的id修饰符,编辑模式切换时会强制SwiftUI销毁旧List实例重建,清空非编辑态下残留的、状态未重置的复用单元格缓存,从根源避免新插入行复用无选择按钮的旧视图。
修复后的核心代码:

List(selection: $selects){
    ForEach(data, id:\.self){item in
        Text(String(item))
    }
    .onDelete{
        data.remove(atOffsets: $0)
    }
}
.id(editMode) // 核心修复逻辑

注意:该修改仅在编辑模式切换时触发一次List重建,不会影响列表日常滚动、增删操作的复用性能,原有编辑选择、滑动删除等交互逻辑完全不受影响。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:06:51