Не отображайте Дату ввода, если она совпадает с предыдущей датой ввода в списке

#swiftui #ios15

Вопрос:

У меня есть список записей, содержащих даты. Я хотел бы отображать дату только в том случае, если она отличается от предыдущей даты ввода.

Я читаю записи из основных данных и передаю их методу ckEntryDate для определения того, следует ли отображать дату. Метод вызывается из списка. Если строка, возвращаемая ckEntryDate, пуста (string.isEmpty) Я знаю, что текущая дата ввода совпадает с предыдущей датой, и мне не нужно отображать дату.

Ошибок не возникает, но текущая дата ввода не сохраняется с помощью пользовательских действий. Я был бы признателен за любые идеи о том, как сохранить текущую дату или как проверить наличие идентичных дат.

Спасибо

 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: FetchedResultslt;CurrTransgt;    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) -gt; (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() -gt; String {    // localized date amp; time formatting  let dateformat = DateFormatter()  dateformat.dateStyle = .medium  dateformat.timeStyle = .none  return dateformat.string(from: self)  } }  

Ответ №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) -gt; (String) {  var outDate: String = ""    // initialzie the entry date  let cdate = item.entryDT ?? Date()  let entryDate = cdate.getFormattedDate()    // if savedDate is blank -gt; 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)  } }