Swift Multidatepicker 无法识别从 Firebase 加载的日期

问题描述 投票:0回答:1

我有一个问题,当日期从 firebase 加载到我的 MultiDatePicker 中时,onChange 函数无法识别“selectedDates”数组中已有的日期,而是将它们重新添加到数组中。 IE。如果我已将 7 月 19 日加载到 multidatePicker 中,它会显示在日历上,但单击它不会从“selectedDates 数组”中删除 7 月 19 日。这是视图的代码:

        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 加载日期,则多日期选择器不会检测到日期的取消选择。这是我从 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")
                }
            }

这是加载日期后的终端输出示例,我在多日期选择器中选择“7 月 24 日”:在此处输入图像描述,在第一行中打印加载的日期数组,在我之后的第二行中在多日期选择器上按 7 月 24 日,它只是再次将其添加到数组中,而不是删除它。

如您所见,我相信我正在使用日期组件正确设置 selectedDates 数组。我的代码是否有问题,或者是否没有办法将日期从 Firebase 传递到 multidatepicker?

firebase google-cloud-firestore swiftui multidatepicker
1个回答
0
投票

使用

[.calendar, .era, .year, .month, .day]
而不是
[.year, .month, .day]
,因为这是 MultiDatePicker 期望的 DateComponents 格式。然后选择就可以正常工作了。

© www.soinside.com 2019 - 2024. All rights reserved.