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的逻辑:
验证Segue标识符是否完全匹配
打开Storyboard,找到触发的Segue,检查它的Identifier是否和代码里的"timeToFinal"完全一致(大小写、拼写、空格都不能错)。检查目标控制器的类型转换是否成功
在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
相关产品推荐
相关产品推荐

