如果与列表中的上一个条目日期相同,则不显示条目日期
Don't Display Entry Date if Same as previous Entry Date in List
我有一个包含日期的条目列表。我只想显示与之前输入日期不同的日期。
我正在读取核心数据中的条目并将它们传递给方法 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)
}
}
}
此方法是 class 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)
}
}
假设您的函数 ckEntryDate
工作正常,您可以尝试这种在 ForEach
:
过滤数据的方法
ForEach(currTrans.filter { "" != userData.ckEntryDate(item: [=10=]) }, id: \.id) { item in
showRow(g:g, item: item, entryDate: userData.ckEntryDate(item: item))
}
你也可以试试这个:
ForEach(currTrans, id: \.id) { item in
let entryDate = userData.ckEntryDate(item: item)
if !entryDate.isEmpty {
showRow(g:g, item: item, entryDate: entryDate)
}
}
我一直在寻找一种方法来保留当前输入日期,以便与下一个输入日期进行比较,以检查日期是否相同。
我发现我可以通过简单地在包含方法 ckEntryDate 的 class 顶部放置一个变量来做到这一点。
class UserData: ObservableObject {
var storedDate: String = ""
感谢所有花时间考虑可能答案的人。
// check if history entry date is the 1st entry or the same as previous date
func ckEntryDate( item: CurrTrans) -> (String) {
var outDate: String = ""
// initialzie the entry date
let cdate = item.entryDT ?? Date()
let entryDate = cdate.getFormattedDate()
// if savedDate is blank -> no previous entries
if storedDate.isEmpty {
outDate = entryDate
}
else { // savedDate is not blank
if storedDate == entryDate {
outDate = ""
}
else { // date entries different
outDate = entryDate
}
}
storedDate = entryDate
// outDate returns blank or the current date
return (outDate)
}
}
我有一个包含日期的条目列表。我只想显示与之前输入日期不同的日期。
我正在读取核心数据中的条目并将它们传递给方法 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)
}
}
}
此方法是 class 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)
}
}
假设您的函数 ckEntryDate
工作正常,您可以尝试这种在 ForEach
:
ForEach(currTrans.filter { "" != userData.ckEntryDate(item: [=10=]) }, id: \.id) { item in
showRow(g:g, item: item, entryDate: userData.ckEntryDate(item: item))
}
你也可以试试这个:
ForEach(currTrans, id: \.id) { item in
let entryDate = userData.ckEntryDate(item: item)
if !entryDate.isEmpty {
showRow(g:g, item: item, entryDate: entryDate)
}
}
我一直在寻找一种方法来保留当前输入日期,以便与下一个输入日期进行比较,以检查日期是否相同。
我发现我可以通过简单地在包含方法 ckEntryDate 的 class 顶部放置一个变量来做到这一点。
class UserData: ObservableObject {
var storedDate: String = ""
感谢所有花时间考虑可能答案的人。
// check if history entry date is the 1st entry or the same as previous date
func ckEntryDate( item: CurrTrans) -> (String) {
var outDate: String = ""
// initialzie the entry date
let cdate = item.entryDT ?? Date()
let entryDate = cdate.getFormattedDate()
// if savedDate is blank -> no previous entries
if storedDate.isEmpty {
outDate = entryDate
}
else { // savedDate is not blank
if storedDate == entryDate {
outDate = ""
}
else { // date entries different
outDate = entryDate
}
}
storedDate = entryDate
// outDate returns blank or the current date
return (outDate)
}
}