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

SwiftUI从.onDelete迁移到.swipeActions实现删除及解决indexSet报错

错误原因
  • .onDelete是List的编辑回调,触发时会自动传入待删除行的索引集合IndexSet,支持批量删除操作
  • .swipeActions是单条行视图的修饰符,作用域在单行渲染逻辑内,不会自动传入IndexSet参数,直接使用未定义的indexSet变量就会触发找不到作用域的报错
  • 滑动操作每次仅对应触发手势的单行,不需要处理多索引的批量删除逻辑
修复步骤
  • 把.swipeActions修饰符移动到行内容视图(也就是你的ShowLineView)上,避免给不满足显示条件的隐藏行添加无效交互
  • 删除时直接使用ForEach闭包中拿到的当前行索引value,调用remove(at:)删除对应元素即可
  • 给滑动动作添加allowsFullSwipe: false配置,即可实现禁用全滑动直接触发删除的效果
  • 可精简原有代码中重复的搜索条件判断,减少冗余逻辑
修正后代码
List {
    ForEach(0..<scan2Clip.saveList.count, id: \.self) { value in
        let currentContent = scan2Clip.saveList[value]
        // 统一判断行是否需要显示
        if !currentContent.isEmpty,
           searchValue.isEmpty || currentContent.localizedCaseInsensitiveContains(searchValue) {
            ShowLineView(value: value)
                .swipeActions(edge: .trailing, allowsFullSwipe: false) {
                    Button(role: .destructive) {
                        // 直接删除当前索引对应的元素
                        scan2Clip.saveList.remove(at: value)
                    } label: {
                        Label("Delete", systemImage: "trash")
                    }
                }
        }
    }
}

补充说明:如果你的数组元素遵循Identifiable协议,更推荐直接遍历元素而非索引,避免数组动态增删时索引错位导致的UI异常,当前写法适配你现有代码逻辑,可以直接运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:21:33