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

iOS预算应用:通过Callback更新并保存UserDefaults每日预算值

Got it! 结合你现有的回调(Callback)机制,把更新后的每日预算值持久化到UserDefaults其实很直观,我给你拆解具体的实现步骤和代码示例:

具体实现方案

1. 确保AddSubtractMoneyVC的回调能正确传递更新后的值

首先确认你的AddSubtractMoneyVC里已经定义了用于传递更新后预算的回调闭包,并且在用户提交金额时完成计算并触发回调:

// AddSubtractMoneyVC.swift
import UIKit

class AddSubtractMoneyVC: UIViewController {
    // 定义回调闭包,接收更新后的每日预算数值
    var updateBudgetCallback: ((Double) -> Void)?
    
    // 假设你有一个输入金额的TextField
    @IBOutlet weak var amountTextField: UITextField!

    @IBAction func submitButtonTapped(_ sender: UIButton) {
        // 1. 验证输入有效性:确保输入是合法的正数
        guard let inputText = amountTextField.text?.trimmingCharacters(in: .whitespaces),
              let inputAmount = Double(inputText),
              inputAmount > 0 else {
            // 这里可以加个提示,比如弹个alert告诉用户输入有效金额
            let alert = UIAlertController(title: "输入错误", message: "请输入有效的正数金额", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "确定", style: .default))
            present(alert, animated: true)
            return
        }
        
        // 2. 从UserDefaults读取原有的每日预算值
        let originalDailyBudget = UserDefaults.standard.double(forKey: "DailyBudget")
        // 3. 计算更新后的预算值(默认值减去消费金额)
        let updatedDailyBudget = originalDailyBudget - inputAmount
        
        // 4. 通过回调把更新后的值传回UserInfoVC
        updateBudgetCallback?(updatedDailyBudget)
        
        // 关闭当前页面回到UserInfoVC
        dismiss(animated: true)
    }
}

2. 在UserInfoVC中接收回调并完成持久化

在UserInfoVC准备Segue跳转时,给AddSubtractMoneyVC设置回调闭包,在闭包里拿到更新后的预算值,立即写入UserDefaults完成持久化:

// UserInfoVC.swift
import UIKit

class UserInfoVC: UIViewController {
    // 显示当前每日预算的Label
    @IBOutlet weak var dailyBudgetLabel: UILabel!
    
    // 定义UserDefaults的key常量,避免拼写错误(推荐做法)
    private enum UserDefaultsKey {
        static let dailyBudget = "DailyBudget"
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // 页面加载时从UserDefaults读取初始预算并显示
        loadAndDisplayCurrentBudget()
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard segue.identifier == "SegueToAddSubtractMoney",
              let destinationVC = segue.destination as? AddSubtractMoneyVC else {
            return
        }
        
        // 设置回调闭包:接收更新后的预算值并处理
        destinationVC.updateBudgetCallback = { [weak self] updatedBudget in
            guard let self = self else { return }
            
            // 1. 把更新后的预算值持久化到UserDefaults
            UserDefaults.standard.set(updatedBudget, forKey: UserDefaultsKey.dailyBudget)
            // 可选:调用synchronize确保立即写入(虽然iOS 10+后系统会自动处理,但特殊场景下可以加)
            UserDefaults.standard.synchronize()
            
            // 2. 更新UI显示最新的预算值
            self.dailyBudgetLabel.text = String(format: "%.2f", updatedBudget)
        }
    }
    
    // 辅助方法:加载并显示当前预算
    private func loadAndDisplayCurrentBudget() {
        let currentBudget = UserDefaults.standard.double(forKey: UserDefaultsKey.dailyBudget)
        dailyBudgetLabel.text = String(format: "%.2f", currentBudget)
    }
}

3. 额外优化建议

  • 避免负数预算:如果你的业务不允许预算出现负数,可以在计算updatedDailyBudget时做限制,比如let updatedDailyBudget = max(originalDailyBudget - inputAmount, 0),确保预算最低为0。
  • 默认值处理:如果是第一次使用App,UserDefaults里可能没有"DailyBudget"的初始值,可以在读取时设置默认值,比如let originalDailyBudget = UserDefaults.standard.double(forKey: UserDefaultsKey.dailyBudget) ?? 100.0(假设默认每日预算是100)。
  • 输入格式优化:可以给amountTextField设置键盘类型为decimalPad,方便用户输入数字。

内容的提问来源于stack exchange,提问作者Coding while Loading

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:06:03