这很容易使用 CoreData + SwiftUI。
以下代码适用于 iOS15+,但您可以使用 NSFetchedResultsController 或 NSFetchRequest / @FetchRequest 执行相同操作,然后将其分组。但要保持实时,需要付出一些努力。
此外,下面的代码旨在与 CoreData 项目的标准 Apple 代码一起使用。我在PersistenceController 中唯一更改的是为timestamp 设置随机日期
newItem.timestamp = Date().addingTimeInterval(60*60*24*Double(Int.random(in: -10...10)))
这是一个简单的图表
import SwiftUI
@available(iOS 15.0, *)
struct DayChart: View {
@SectionedFetchRequest(entity: Item.entity(), sectionIdentifier: \.completionDate, sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)], predicate: nil, animation: Animation.linear)
var sections: SectionedFetchResults<String, Item>
@State var maxCount: Int = 1
let spacing: CGFloat = 3
var body: some View {
VStack{
GeometryReader{ geo in
HStack(alignment: .bottom, spacing: spacing){
ForEach(sections){section in
VStack{
Text(section.count.description)
Rectangle()
.foregroundColor(.blue)
.onAppear(){
maxCount = max(maxCount,section.count)
}
Text(section.id.description).minimumScaleFactor(0.5)
.lineLimit(2)
}.frame(width: (geo.size.width/CGFloat(sections.count) - spacing),height: geo.size.height * CGFloat(CGFloat(section.count)/CGFloat(maxCount)))
}
}
}
}.padding(.leading, spacing)
}
}
@available(iOS 15.0, *)
struct DayChart_Previews: PreviewProvider {
static var previews: some View {
DayChart().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
extension Item{
//This is the variable that determines your section/column/completion date
@objc
var completionDate: String{
if self.timestamp != nil{
let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd\nMMM"
return dateFormatter.string(from: self.timestamp!)
}else{
return ""
}
}
}