Swift Multidatepicker не распознает даты, загруженные из Firebase

У меня проблема: когда даты загружаются из Firebase в мой MultiDatePicker, функция onChange не распознает даты, которые уже находятся в массиве «selectedDates», вместо этого повторно добавляя их в массив. Т.е. если я загрузил 19 июля в multidatePicker, он отображается в календаре, но щелчок по нему не удаляет 19 июля из «массива selectedDates». Это код представления:

        VStack {
            MultiDatePicker("Select dates", selection: $selectedDates)
                .padding()
                .onChange(of: selectedDates) { oldValue, newValue in
                    saveDates(dates: selectedDates)
                 }
            List(savedDates, id: \.self) { date in
                Text("\(date, formatter: dateFormatter)")
            }
            .listStyle(.plain)
        }
        .onAppear {
            loadSavedDates()
        }

Где selectedDates — это переменная состояния:

@State var selectedDates: Set<DateComponents> = []

Если в Firebase ничего нет, выбор и отмена выбора дат происходит нормально, но если я загружаю даты из Firebase, то multidatepicker не обнаруживает отмену выбора дат. Вот мой код для загрузки дат из Firebase:

func loadSavedDates() {
        let db = Firestore.firestore()
        let uid = try! AuthenticationManager.shared.getAuthenticatedUser().uid
        print("User ID: \(uid)")
        print(widget.id.uuidString)
        
        db.collection("spaces")
            .document(spaceId)
            .collection("dates")
            .document(widget.id.uuidString)//widget.id.uuidString
            .getDocument {document, error in
                if let document = document {
                    if let dateStrings = document.data()?[uid] as? [String] {
                        let dateFormatter = DateFormatter()
                        dateFormatter.dateStyle = .medium
                        self.savedDates = dateStrings.compactMap { dateFormatter.date(from: $0) }.sorted()
                        let calendar = Calendar.current
                        self.selectedDates = Set(self.savedDates.map { calendar.dateComponents([.year, .month, .day], from: $0) })
                        for component in selectedDates {
                            print(component.isValidDate)
                        }
                    }
                } else {
                    print("Document does not exist")
                }
            }

Это пример вывода терминала после загрузки дат и выбора «24 июля» в мультидатпикере:введите здесь описание изображения, в первой строке он печатает загруженный массив дат, а во второй строке после того, как я нажмите 24 июля на multidatepicker, он просто снова добавит его в массив, а не удалит.

Как видите, я считаю, что правильно устанавливаю массив selectedDates с помощью компонентов даты. Есть ли проблема с моим кодом или просто нет способа передать даты из Firebase в multidatepicker?

Мы не видим ваши исходные данные в Firestore, поэтому не знаем, что этот код собирается делать с этими данными. Пожалуйста, отредактируйте вопрос, чтобы показать фактические данные, с которыми вы работаете. Также было бы неплохо записать некоторые из этих данных в ваш код и показать нам результаты регистрации, чтобы мы могли следовать дальше. В вашем посте должно быть достаточно информации, чтобы любой мог скопировать его и увидеть тот же неожиданный результат, который наблюдаете вы.

Doug Stevenson 13.07.2024 20:21

Ошибка сообщает вам, что в ваших данных, например savedDates в List(savedDates, id: \.self) { ...} или там, где у вас есть ForEach, есть даты с одинаковыми значениями (происходит несколько раз....). Это означает, что ваши компоненты дат имеют одинаковые значения. Не используйте DateComponents используйте свои собственные struct MyDateComp: Identifiable {...}, где вы создаете уникальные id = UUID() для каждого.

workingdog support Ukraine 14.07.2024 00:28
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте [.calendar, .era, .year, .month, .day] вместо [.year, .month, .day], потому что это формат DateComponents, который ожидает MultiDatePicker. Тогда выбор будет работать корректно.

большое спасибо, я новичок в StackOverflow, поэтому не могу проголосовать за ваш ответ, но ценю помощь, это сработало. Спасибо!

Joshua Shen 15.07.2024 17:08

@JoshuaShen Всегда пожалуйста! Вы сможете принять ответ, поставив галочку.

John 17.07.2024 12:24

Другие вопросы по теме