如果与列表中的上一个条目日期相同,则不显示条目日期

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)
    }
}