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

iOS Swift中UIDatePicker和UIStepper跨页面传值问题求解

问题根因

  • 日期选择控制器的didTapNext方法仅给详情页属性赋值,未执行页面跳转逻辑,日期数据无法传递到后续流程
  • 现有逻辑为两个控制器分别实例化全新的storeDetailsViewController对象,两次生成的实例完全独立,数据无法互通
  • 流程逻辑缺失:正常流程应为「日期选择→数量选择→信息核对」,当前代码中日期页未跳转到数量选择页,直接跳过了中间步骤

修复方案(推荐使用全局数据单例存储中间选择数据,实现最简单、适配多页面传值场景)

步骤1:创建全局数据管理类

新建Swift文件StoreUserSelectionData.swift,代码如下:

import UIKit

class StoreUserSelectionData: NSObject {
    // 全局共享单例
    static let shared = StoreUserSelectionData()
    
    // 存储用户选择的所有数据
    var dropOffDate: String = ""
    var pickUpDate: String = ""
    var goodsCount: String = ""
    
    private override init() {} // 禁止外部创建新实例
}

步骤2:修改日期选择控制器代码

修改StoreDatesViewController的didTapNext方法,先把数据存入单例,再跳转到数量选择页:

@IBAction func didTapNext() {
    guard let dropOffText = dropOff.text, !dropOffText.isEmpty,
          let pickUpText = pickUp.text, !pickUpText.isEmpty else {
        // 可自行添加未选择日期的Toast提示
        return
    }
    // 数据存入全局单例
    StoreUserSelectionData.shared.dropOffDate = dropOffText
    StoreUserSelectionData.shared.pickUpDate = pickUpText
    // 跳转至数量选择页,注意把storyboardID替换为你自己数量页对应的ID
    let quantityVC = self.storyboard?.instantiateViewController(withIdentifier: "storeQuantityVC") as! StoreQuantityViewController
    self.navigationController?.pushViewController(quantityVC, animated: true)
}

步骤3:修改数量选择控制器代码

修改StoreQuantityViewController的next方法,把数量存入单例后再跳转详情页:

@IBAction func next(_ sender: Any) {
    guard let countText = numbers.text, !countText.isEmpty else {
        // 可自行添加未选择数量的Toast提示
        return
    }
    // 数量存入全局单例
    StoreUserSelectionData.shared.goodsCount = countText
    // 跳转至信息核对详情页
    let storeDetailsVC = self.storyboard?.instantiateViewController(withIdentifier: "storeDetailsVC") as! storeDetailsViewController
    self.navigationController?.pushViewController(storeDetailsVC, animated: true)
}

步骤4:信息核对详情页读取数据展示

在storeDetailsViewController的viewDidLoad方法中直接从单例取所有数据,赋值给对应展示控件即可:

override func viewDidLoad() {
    super.viewDidLoad()
    // 示例:给对应展示Label赋值,控件名替换为你自己的UI控件ID
    dropOffShowLabel.text = StoreUserSelectionData.shared.dropOffDate
    pickUpShowLabel.text = StoreUserSelectionData.shared.pickUpDate
    countShowLabel.text = StoreUserSelectionData.shared.goodsCount
}

可选优化点

  • 增加日期选择逻辑限制:还车日期不能早于取车日期,避免无效数据
  • 给UIStepper设置默认值为1,避免数量为空的情况
  • 单例数据可在用户提交订单后手动清空,避免重复进入流程出现数据残留

内容的提问来源于stack exchange,提问作者Charles Morgan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:15:08