【问题标题】:Don't Display Entry Date if Same as previous Entry Date in List如果与列表中的先前输入日期相同,则不显示输入日期
【发布时间】: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)
    }
}

【问题讨论】:

    标签: swiftui ios15


    【解决方案1】:

    假设您的函数ckEntryDate 工作正常,您可以尝试这种过滤ForEach 处的数据的方法:

    ForEach(currTrans.filter { "" != userData.ckEntryDate(item: $0) }, 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)
        }
    }
    

    【讨论】:

      【解决方案2】:

      我一直在寻找一种方法来保存当前的输入日期,以便与下一个输入日期进行比较,以检查日期是否相同。

      我发现我可以通过简单地在包含方法 ckEntryDate 的类的顶部放置一个变量来做到这一点。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        相关资源
        最近更新 更多