如何在SwiftData的筛选列表中使用.onDelete修饰符
解决SwiftData ListView中使用.onDelete的问题
要在独立的ListView中使用.onDelete修饰符,核心是获取SwiftData的modelContext,你不需要手动从ContentView传递,直接通过环境变量即可获取。具体步骤如下:
- 在ListView中添加
@Environment(\.modelContext)属性,获取数据上下文 - 实现删除数据的方法
- 为ForEach绑定.onDelete修饰符
修改后的ListView代码如下:
struct ListView: View { @Environment(\.modelContext) var modelContext // 添加这行获取上下文 @Query var users: [UserModel] init(filterByUserName: String) { _users = Query(filter: #Predicate<UserModel> { user in user.name.contains(filterByUserName)}, sort: \UserModel.name) } var body: some View { List { ForEach(users) { user in Text(user.name) } .onDelete(perform: deleteUser) // 绑定删除操作 } } // 实现删除方法 private func deleteUser(at offsets: IndexSet) { for offset in offsets { let user = users[offset] modelContext.delete(user) // 可选:如果需要立即保存,可调用try? modelContext.save() // 默认SwiftData会自动处理保存,除非手动关闭了自动保存 } } }
原理说明
@Environment(\.modelContext)会自动从父视图(ContentView)继承环境中的数据上下文——因为ContentView已经通过@Environment(\.modelContext)获取了上下文,所有子视图都能直接访问这个环境变量,不需要额外手动传递。
这样修改后,你就能在ListView中正常使用.onDelete删除SwiftData中的数据,同时筛选功能也能保持正常工作。
内容的提问来源于stack exchange,提问作者Mat Fetsch
相关产品推荐
相关产品推荐

