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
相关产品推荐
相关产品推荐

