如何在 SwiftUI 视图中动态处理 FetchRequest 数据
How can I dynamically work with FetchRequest data in SwiftUI view
我正在尝试使用 SwiftUI 创建一个卡路里计数器视图,其中锻炼数据是从核心数据中获取的,除了写出所有数据外,我还想获得今天燃烧的卡路里总数。我正在考虑通过获取的数据,检查其 createdAt
属性是否等于当前 Date()
,如果是,则将其加起来等于 self.totalCaloriesBurntToday
.
我收到一个错误,指出这种类型的 ForEach 不符合某些协议:
Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols
这是我的代码:
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
具有 return 类型的 Content
,这意味着循环中的每个项目都必须 return 一些 View
.它与简单的 foreach
循环不同。
您可以使用 reduce
计算 totalCaloriesBurnt
并使用 filter
仅选择今天的锻炼。
为了比较日期,最好使用 Calendar.compare
:
Calendar.current.compare(singleWorkout.createdAt, to: Date(), toGranularity: .day) == .orderedSame
总结您的代码如下所示:
workoutData
.filter { Calendar.current.compare([=11=].createdAt, to: Date(), toGranularity: .day) == .orderedSame }
.reduce(0) { [=11=] + Int(.caloriesBurnt)! }
我正在尝试使用 SwiftUI 创建一个卡路里计数器视图,其中锻炼数据是从核心数据中获取的,除了写出所有数据外,我还想获得今天燃烧的卡路里总数。我正在考虑通过获取的数据,检查其 createdAt
属性是否等于当前 Date()
,如果是,则将其加起来等于 self.totalCaloriesBurntToday
.
我收到一个错误,指出这种类型的 ForEach 不符合某些协议:
Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols
这是我的代码:
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
具有 return 类型的 Content
,这意味着循环中的每个项目都必须 return 一些 View
.它与简单的 foreach
循环不同。
您可以使用 reduce
计算 totalCaloriesBurnt
并使用 filter
仅选择今天的锻炼。
为了比较日期,最好使用 Calendar.compare
:
Calendar.current.compare(singleWorkout.createdAt, to: Date(), toGranularity: .day) == .orderedSame
总结您的代码如下所示:
workoutData
.filter { Calendar.current.compare([=11=].createdAt, to: Date(), toGranularity: .day) == .orderedSame }
.reduce(0) { [=11=] + Int(.caloriesBurnt)! }