You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将选中日期存入数组并上传至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:08:15