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

如何在iOS中创建Budget类实例并传值至新ViewController展示数据?

你现在的代码里有个关键问题:在generateBudgetPressed里创建的Budget实例只是局部变量,既没传递到下一个ViewController,而且你先调用performSegue再创建实例的顺序也不对。下面是完整的实现方案,还有一些实用的优化建议:

一、核心实现步骤

1. 准备目标ViewController

首先假设你的目标展示页面叫BudgetDisplayVC,给它添加一个Budget类型的属性(用可选型更安全,避免初始化时的强制依赖):

import UIKit

class BudgetDisplayVC: UIViewController {
    // 用于接收传递过来的Budget实例
    var budget: Budget?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 在页面加载后展示数据,比如赋值给UILabel
        if let budget = budget {
            // 示例:假设你有一个展示总收入的Label
            // grossIncomeLabel.text = "总收入:\(budget.grossIncome)"
            print("总收入:\(budget.grossIncome)")
        }
    }
}

2. 修改源ViewController的代码

先修正generateBudgetPressed的逻辑:先验证输入合法性,创建Budget实例,再触发Segue;然后通过prepare(for:sender:)方法完成数据传递:

import UIKit

class CreateNewBudgetVC: UIViewController {
    @IBOutlet weak var grossIncomeVal: UITextField!
    // ... 其他IBOutlet保持不变
    
    @IBAction func cancelPressed(_ sender: Any) {
        performSegue(withIdentifier: "CancelSegue", sender: self)
    }
    
    @IBAction func generateBudgetPressed(_ sender: Any) {
        // 安全验证输入,避免强制解包导致崩溃
        guard let incomeText = grossIncomeVal.text, 
              !incomeText.isEmpty, 
              let grossIncome = Int(incomeText),
              grossIncome > 0 else {
            // 给用户提示输入无效
            let alert = UIAlertController(title: "输入错误", message: "请输入大于0的有效总收入数字", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "确定", style: .default))
            present(alert, animated: true)
            return
        }
        
        // 创建Budget实例并作为sender传递给Segue
        let budget = Budget(grossIncome: grossIncome)
        performSegue(withIdentifier: "GenerateSegue", sender: budget)
    }
    
    // 重写Segue准备方法,传递数据
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "GenerateSegue" {
            // 安全转换目标VC类型和传递的实例
            guard let destinationVC = segue.destination as? BudgetDisplayVC,
                  let budget = sender as? Budget else {
                return
            }
            destinationVC.budget = budget
        }
    }
}

二、优化方案

1. 简化Budget类的实现

你当前的Budget类用了私有变量加计算属性的写法,完全没必要——如果总收入是初始化后不可修改的,直接用let存储属性即可,代码更简洁易读:

import Foundation

class Budget {
    let grossIncome: Int
    
    init(grossIncome: Int) {
        self.grossIncome = grossIncome
    }
}

后续扩展其他属性(比如界面里的location、免税额度等)时,直接添加对应的let或var属性即可。

2. 输入体验优化

可以给grossIncomeVal设置键盘类型为数字键盘,减少用户输入错误:

override func viewDidLoad() {
    super.viewDidLoad()
    grossIncomeVal.keyboardType = .numberPad
}

3. 代码跳转替代Segue(可选)

如果之后你改用纯代码创建ViewController而不是Storyboard Segue,用直接赋值的方式更灵活:

@IBAction func generateBudgetPressed(_ sender: Any) {
    guard let incomeText = grossIncomeVal.text, 
          !incomeText.isEmpty, 
          let grossIncome = Int(incomeText),
          grossIncome > 0 else {
        // 提示逻辑同上
        return
    }
    let budget = Budget(grossIncome: grossIncome)
    let displayVC = BudgetDisplayVC()
    displayVC.budget = budget
    // 根据导航结构选择push或present
    navigationController?.pushViewController(displayVC, animated: true)
    // 或者 present(displayVC, animated: true)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:41