SwiftUI中如何按priority过滤@EnvironmentObject任务数组填充列表
实现方案
你原有代码存在以下核心问题:
- 不能在视图的存储属性中直接访问
@EnvironmentObject,视图初始化阶段环境对象尚未完成注入,会触发运行时错误 filter闭包逻辑错误:误用赋值运算符=而非相等判断==,且不需要通过$前缀访问taskdata.tasks($是用来获取Binding类型的,普通读取直接访问属性即可)- 静态存储属性无法响应
byPriority或taskdata.tasks的变化,不会自动重新过滤数据 - 变量名拼写错误:
byPriotity应为byPriority,避免调用时报未找到属性的错误
以下是可直接运行的实现代码:
struct TasksView: View { @EnvironmentObject private var taskdata: DataModel // 修正拼写错误 @State var byPriority: Int // 改用计算属性,每次视图刷新时动态过滤,自动响应数据变化 private var filteredTasks: [Task] { taskdata.tasks.filter { task in task.priority == byPriority } } var body: some View { // 直接把过滤后的数组作为列表数据源 List(filteredTasks) { task in // 任务项视图示例,可按需求修改 HStack { Text(task.title) Spacer() if task.completed { Image(systemName: "checkmark.circle.fill") .foregroundColor(.green) } } } // 优先级切换按钮示例,点击自动重新过滤刷新列表 .toolbar { HStack(spacing: 16) { Button("低优") { byPriority = 1 } Button("中优") { byPriority = 2 } Button("高优") { byPriority = 3 } } } } }
如果需要支持显示所有优先级,可以扩展过滤逻辑:
private var filteredTasks: [Task] { // 假设byPriority为0时显示全部任务 if byPriority == 0 { return taskdata.tasks } return taskdata.tasks.filter { $0.priority == byPriority } }
内容的提问来源于stack exchange,提问作者Aleph
相关产品推荐
相关产品推荐

