跨Storyboard传值时Controller仅获取score初始0值的问题
Quiz应用跨页面分数传值为0问题修复
传值后始终拿到初始0值的问题,90%是实例拿错/赋值时机不对导致的,按以下顺序排查即可:
- 先验证计数逻辑本身正确性
在counter累加逻辑的最后一步打断点,确认计数结束后counter的实际值和预期得分一致,同时确认你有在计数完成后执行score = counter的同步赋值,不要把赋值语句写在计数函数启动之前。 - 排查跨Storyboard跳转的实例问题
跨Storyboard跳转时如果直接新生成目标Controller/Model对象,这个新对象和你跑计数逻辑的对象是完全独立的两个实例,相当于你在A实例里算完了分,转头去读B实例里初始化的0值,自然拿不到更新后的分数。正确传值流程:- 跳转前先接住实例化的目标页面对象,不要写完instantiate直接跳转:
// 替换为你自己的Storyboard名和页面ID let resultVC = UIStoryboard(name: "ResultPage", bundle: nil) .instantiateViewController(identifier: "ResultViewController") as! ResultViewController - 等计数完全结束拿到最终counter值后,再给目标页面的分数属性赋值,不要提前赋值、不要传未同步的初始score变量:
resultVC.totalScore = counter - 赋值完成后再执行present/push跳转操作,禁止先跳转再传值。
- 跳转前先接住实例化的目标页面对象,不要写完instantiate直接跳转:
- 排查值类型拷贝问题
如果你的score是定义在struct(结构体)里的属性,值类型传递时会生成全新副本,副本上的数值修改不会同步回原变量;这种场景要么把承载分数的Model改成class(引用类型),要么直接按上面的流程在跳转节点显式传最终counter值即可。
注意:绝对不要尝试直接给另一个Storyboard页面上的label控件赋值,未加载的页面label控件为nil,赋值操作会直接失效。正确做法是把分数传给目标Controller的普通属性,等目标Controller自身加载完成(
viewDidLoad生命周期回调里),再把属性值赋值给页面上的label控件。
内容的提问来源于stack exchange,提问作者user19303798
相关产品推荐
相关产品推荐

