IBAction中设置的self实例变量未保存 跨VC传值仅返回默认值
问题根因
- 你在
GameViewController中通过NumberOfPlayersViewController()手动创建的控制器实例,和界面上用户实际操作、触发Segue跳转的控制器是完全独立的两个对象,手动创建的实例没有接收过用户的滑块操作,所以numOfPlayers永远返回初始值1。 - 你没有使用Storyboard Segue的标准传值逻辑,而是错误手动实例化上一级控制器,自然无法获取用户修改后的值。
修复步骤
1. 配置Segue标识
打开Storyboard,选中NumberOfPlayersViewController到GameViewController的Segue连线,在右侧属性检查器的Identifier栏填写唯一标识,比如toGamePage。
2. 添加上级控制器的Segue传值逻辑
在NumberOfPlayersViewController.swift中添加prepare(for:sender:)方法,跳转前将选中的玩家数传递给目标页面:
// 补充到NumberOfPlayersViewController类中 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "toGamePage", let gameVC = segue.destination as? GameViewController else { return } gameVC.numOfPlayers = self.numOfPlayers }
3. 修正GameViewController的属性定义
删除手动创建的NumberOfPlayersViewController实例,将玩家数属性修改为等待外部赋值的普通变量即可:
// GameViewController.swift修改后完整代码 import UIKit class GameViewController:UIViewController { // 保留默认值,等待前序页面传值覆盖 var numOfPlayers: Int = 1 override func viewDidLoad() { super.viewDidLoad() print(numOfPlayers) // 可正常拿到用户选择的数值 } }
额外优化点
你当前代码中Int(sender.value)是直接截断小数部分取整,如果需要实现你描述的「四舍五入取整」,可以将滑块赋值逻辑修改为:
numOfPlayers = Int(round(sender.value))
内容的提问来源于stack exchange,提问作者DartRuffian
相关产品推荐
相关产品推荐

