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

Segue未传递数据求助:计时器触发后变量传值为nil

解决Segue跳转时变量传递为nil的问题

看起来你遇到了Storyboard Segue传值时变量为nil的问题,我来帮你一步步排查和解决:

首先,确认源控制器中的变量本身是否有值

你提到这些变量来自滑块和选择器,但有可能在触发Segue时,这些变量根本就没被正确赋值。第一步一定要先验证这一点:

在updateTimer函数中,调用performSegue之前,添加打印语句,确认变量的值:

@objc func updateTimer(){ 
    if seconds < 1 { 
        timer.invalidate() 
        isTimerRunning = false 
        // 添加打印,检查变量是否为nil
        print("准备传值:minutesTotal = \(minutesTotal), startValue = \(startValue), startFraction = \(startFraction), currentTank = \(currentTank)")
        performSegue(withIdentifier: "timeToFinal", sender: self) 
    } else { 
        seconds -= 1 
        timeLabel.text = timeString(time: TimeInterval(seconds)) 
    } 
}

如果打印结果显示这些变量是nil,那问题出在滑块/选择器的赋值逻辑上:

  • 检查滑块的valueChanged事件是否正确关联到ViewController的方法,并且在该方法里把滑块的值赋值给minutesTotal
  • 检查选择器的didSelectRowAt(UIPickerView)或者valueChanged(UISegmentedControl等)事件是否正确触发,并且把选中的值赋值给startValue、startFraction、currentTank
  • 确保这些变量有默认值(比如用户没操作滑块/选择器时,给个初始值)

检查Segue的匹配和类型转换

如果源控制器的变量有值,但传过去还是nil,那要检查prepareSegue的逻辑:

  1. 验证Segue标识符是否完全匹配
    打开Storyboard,找到触发的Segue,检查它的Identifier是否和代码里的"timeToFinal"完全一致(大小写、拼写、空格都不能错)。

  2. 检查目标控制器的类型转换是否成功
    在prepareSegue中添加转换失败的提示,确认是否能正确拿到FinalFlowViewController实例:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "timeToFinal"{ 
        if let finalFlowViewController = segue.destination as? FinalFlowViewController{ 
            finalFlowViewController.currentTank = currentTank 
            finalFlowViewController.startFraction = startFraction 
            finalFlowViewController.startValue = startValue 
            finalFlowViewController.time = minutesTotal 
        } else {
            // 打印转换失败信息
            print("无法将Segue目标转换为FinalFlowViewController")
        }
    } 
}

如果打印了这条信息,说明:

  • Storyboard中Segue的目标控制器不是FinalFlowViewController,检查目标控制器的Class是否正确设置
  • 目标控制器的类名拼写错误(比如大小写不一致)

检查目标控制器的变量定义

最后,确认FinalFlowViewController中的变量是否正确声明:
比如,这些变量应该是可选类型或者隐式解包可选类型(如果是非可选类型,传nil会直接崩溃,所以你的情况应该是可选类型):

// FinalFlowViewController.swift
var currentTank: YourDataType? // 替换成你的实际类型,比如String/Int等
var startFraction: YourDataType?
var startValue: YourDataType?
var time: YourDataType?

如果变量被声明为非可选类型,但源控制器的变量可能为nil,就会出现问题(不过这种情况会直接崩溃,所以你的情况更可能是变量本身没被赋值)。

总结

按照这个顺序排查:

  • 先确认源控制器的变量是否有值
  • 再检查Segue的标识符和类型转换
  • 最后确认目标控制器的变量定义

内容的提问来源于stack exchange,提问作者Jose Hermosillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:48:12