【发布时间】:2022-01-04 18:05:49
【问题描述】:
我有一个包含日期的条目列表。如果日期与之前的输入日期不同,我只想显示日期。
我正在从核心数据中读取条目并将它们传递给方法 ckEntryDate 以确定是否显示日期。从列表内部调用该方法。如果ckEntryDate返回的字符串为空(string.isEmpty)我就知道当前的输入日期和上一个日期是一样的,我不需要显示日期。
没有发生错误,但当前输入日期未通过 userDefaults 保存。我将不胜感激有关如何保存当前日期或如何检查相同日期的任何想法。
谢谢
struct HistoryView: View {
@EnvironmentObject var userData: UserData
@Environment(\.managedObjectContext) var viewContext
// fetch core data
@FetchRequest(
entity: CurrTrans.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \CurrTrans.entryDT, ascending: true)]
) var currTrans: FetchedResults<CurrTrans>
var body: some View {
GeometryReader { g in
VStack (alignment: .leading) {
ShowTitle(g:g, title: "History")
ShowHistoryHeader(g: g)
ScrollView (.vertical) {
List {
ForEach(currTrans, id: \.id) { item in
let entryDate = userData.ckEntryDate( item: item)
showRow(g:g, item: item, entryDate: entryDate)
}
.onDelete(perform: deleteItem)
}
}.font(.body)
}
}
}
此方法是 UserData 类的一部分:ObservableObject {
// check if history entry date is same as previous date or the first entry
func ckEntryDate( item: CurrTrans) -> (String) {
var outDate: String = ""
var savedDate: String = ""
//read in savedDate
if UserDefaults.standard.string(forKey: "storeDate") != "" {
savedDate = UserDefaults.standard.string(forKey: "storeDate") ?? ""
}else {
savedDate = ""
}
// convert Date? to String
let cdate = item.entryDT ?? Date()
let currDate = cdate.getFormattedDate()
// check if no previous entries
if savedDate.isEmpty {
outDate = currDate
}
else { // savedDate is not blank
if savedDate == currDate {
outDate = ""
}
else { // date entries different
outDate = currDate
}
savedDate = currDate
}
// save savedDate
UserDefaults.standard.set(savedDate, forKey: "saveDate")
return outDate
}
}
extension Date {
func getFormattedDate() -> String {
// localized date & time formatting
let dateformat = DateFormatter()
dateformat.dateStyle = .medium
dateformat.timeStyle = .none
return dateformat.string(from: self)
}
}
【问题讨论】: