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