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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 22:06:01