如何将选中日期存入数组并上传至Firestore文档?
问题解决思路及代码优化
你的核心问题出在两个地方:一是闭包内变量赋值的作用域问题,二是依赖UI容器的isHidden状态判断数据是否存在,容易导致数据与UI状态不同步。不需要完全重写handleDateCreationTapped(),只需调整数据赋值和数组构建逻辑即可解决。
具体修复步骤
1. 修正闭包内的实例变量赋值
在handleDateCreationTapped()的闭包中,需明确使用self.访问实例变量(因闭包捕获了弱引用self),否则可能创建闭包内局部变量,导致外部实例变量未被正确赋值。
2. 重构数组构建逻辑,抛弃UI状态依赖
不要通过secondDateContainer.isHidden或thirdDateContainer.isHidden判断是否添加数据,直接根据已赋值的可选变量是否存在来处理,实现数据逻辑与UI展示解耦,避免同步问题。
3. 简化重复代码
原handleDateCreationTapped()的多分支逻辑存在大量重复,拆分后每个日期的处理独立,更易维护,同时在未选中时清空对应变量和UI内容,避免脏数据残留。
修改后的完整代码
var firstDayAndTimes: String? var secondDayAndTimes: String? var thirdDayAndTimes: String? // MARK: - Selectors @objc func handleDateCreationTapped() { controller.continueCallback = { [weak self] isSelected in guard let self = self else { return } let viewModel = controller.viewModel // 处理第一个日期的UI和数据 self.dateLabel.text = viewModel.selectedDate self.timeOfDayLabel.text = viewModel.selectTimesOfDay.joined(separator: ", ") self.firstDayAndTimes = "\(viewModel.selectedDate) | \(viewModel.selectTimesOfDay.joined(separator: ", "))" // 处理第二个日期(如果选中) if controller.selectedCardViewCount >= 2 { self.secondDateLabel.text = viewModel.selectedSecondDate self.secondTimeOfDayLabel.text = viewModel.selectSecondTimesOfDay.joined(separator: ", ") self.secondDayAndTimes = "\(viewModel.selectedSecondDate) | \(viewModel.selectSecondTimesOfDay.joined(separator: ", "))" } else { self.secondDateLabel.text = nil self.secondTimeOfDayLabel.text = nil self.secondDayAndTimes = nil } // 处理第三个日期(如果选中) if controller.selectedCardViewCount == 3 { self.thirdDateLabel.text = viewModel.selectedThirdDate self.thirdTimeOfDayLabel.text = viewModel.selectThirdTimesOfDay.joined(separator: ", ") self.thirdDayAndTimes = "\(viewModel.selectedThirdDate) | \(viewModel.selectThirdTimesOfDay.joined(separator: ", "))" } else { self.thirdDateLabel.text = nil self.thirdTimeOfDayLabel.text = nil self.thirdDayAndTimes = nil } } } // MARK: - Helper Functions func handleJobRequestCreation(customer: Customer, fullAddress: String) { var dayAndTimesArray: [String] = [] // 直接根据可选变量是否存在添加数据 if let first = firstDayAndTimes { dayAndTimesArray.append(first) } if let second = secondDayAndTimes { dayAndTimesArray.append(second) } if let third = thirdDayAndTimes { dayAndTimesArray.append(third) } var data: [String: Any] = [ "dayAndTimesArray": dayAndTimesArray, ] // 直接将可选变量赋值给字典,Swift自动处理nil情况 data["firstDayAndTimes"] = firstDayAndTimes data["secondDayAndTimes"] = secondDayAndTimes data["thirdDayAndTimes"] = thirdDayAndTimes }
关键改进说明
- 闭包内明确使用
self.:确保实例变量被正确赋值,避免局部变量覆盖问题。 - 数据与UI解耦:数组构建不再依赖UI容器状态,直接基于已赋值的可选变量,保证数据逻辑独立性。
- 简化分支逻辑:拆分重复的UI赋值代码,未选中时主动清空变量和UI内容,避免脏数据。
- 优化Firestore数据赋值:直接将可选变量传入字典,无需额外if判断,Swift会自动忽略nil值。
修改后,选中的日期数据会正确存入数组并上传至Firestore文档。
内容的提问来源于stack exchange,提问作者Zachary Smouse
相关产品推荐
相关产品推荐

