swift - 如何在 SwiftUI 视图中动态处理 FetchRequest 数据
问题描述
我正在尝试使用 SwiftUI 创建一个卡路里计数器视图,其中锻炼数据是从核心数据中获取的,除了写出所有数据之外,我还想获得今天燃烧的卡路里总数。我正在考虑遍历获取的数据,检查其createdAt
属性是否等于 current Date()
,如果是,则将其加到 sum of 中self.totalCaloriesBurntToday
。
我收到一个错误,表明这种类型的 ForEach 不符合某些协议:
类型 '()' 不能符合 'View';只有结构/枚举/类类型可以符合协议
这是我的代码:
import SwiftUI
struct ProgressBar: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
entity: WorkoutInputData.entity(),
sortDescriptors: []
) var workoutData: FetchedResults<WorkoutInputData>
@State private var totalCaloriesBurntToday : Int
var body: some View {
ForEach(workoutData) { singleWorkout in
if singleWorkout.createdAt == Date(){
self.totalCaloriesBurntToday += Int(singleWorkout.caloriesBurnt)!
}
}
return Text("\(self.totalCaloriesBurntToday)")
}
}
我想稍后输出总和并希望它动态改变。每次添加或删除某些数据对象时,总和都会自动调整。
我曾尝试使用 UserDefaults 来解决此问题,以保存那里的卡路里,但存在的问题是 UserDefaults 中的数据更改不会自动推动视图中的更改,因此它不是动态的。
解决方案
您使用的 SwiftUI 的ForEach
返回类型为Content
,这意味着对于循环中的每个项目,它都必须返回 some View
。它与简单的foreach
循环不同。
您可以使用仅reduce
计算totalCaloriesBurnt
和filter
选择今天的锻炼。
为了比较日期,最好使用Calendar.compare
:
Calendar.current.compare(singleWorkout.createdAt, to: Date(), toGranularity: .day) == .orderedSame
总结您的代码可能如下所示:
workoutData
.filter { Calendar.current.compare($0.createdAt, to: Date(), toGranularity: .day) == .orderedSame }
.reduce(0) { $0 + Int($1.caloriesBurnt)! }
推荐阅读
- flutter - Flutter 图像选择器 Web
- php - 如何使用 Laravel 集成 CCAvenue
- c# - 从多个内部元素 od XML 文件中获取名称属性值到 C#
- vbscript - 验证 vbScript 参数名称
- python - 使用 Biopython 时:NameError: name 'pubmed_id' is not defined 即使之前已经定义过?
- python - 套接字编程:客户端在向服务器发送 3 条消息后停止响应
- android - 获取改造异步调用的结果
- php - 数据库中有两个不同的表我想按日期或时间顺序从一个表中获取数据?
- javascript - Canvas 圆弧函数的含义
- asp.net-core - 在 ASP.NET Core 中禁用请求验证令牌