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
相关产品推荐
相关产品推荐

