Swift/Xcode中如何通过按钮即时重置数组?
问题根源
你当前的清空逻辑犯了一个核心错误:在emptyPiggy方法里新建了一个CalcScreen实例,你修改的是这个全新对象的数组,而不是APP中正在运行的主屏幕实例的tipArray。所以原主屏幕的数组根本没变化,只有重启APP时才会从UserDefaults读取新的空值,导致即时清空无效。
解决方案
我们通过闭包回调让第二个屏幕直接通知主屏幕处理清空逻辑,同时更新界面显示:
1. 修改累计总额页面(TipTotalView)代码
添加闭包用于通知主屏幕执行清空操作,同时更新当前页面的显示:
import UIKit class TipTotalView: UIViewController { @IBOutlet weak var totalTip: UILabel? var tipToText = "" // 新增闭包,用来通知主屏幕处理清空逻辑 var onClearPiggy: (() -> Void)? override func viewDidLoad() { super.viewDidLoad() totalTip?.text = tipToText } @IBAction func emptyPiggy(_ sender: Any) { // 调用闭包让主屏幕处理清空 onClearPiggy?() // 即时更新当前页面的总额显示 totalTip?.text = "0" tipToText = "0" } }
2. 修改主屏幕(CalcScreen)代码
跳转时给闭包赋值,让它处理真正的数组清空与存储逻辑,同时避免重复使用同一个TipTotalView实例:
import UIKit class CalcScreen: UIViewController { @IBOutlet weak var tipAmount: UILabel! var tipArray: [Int] = [] var tipArrayTotal: Int { return tipArray.reduce(0, +) } func loadDefaults() { tipArray = UserDefaults.standard.array(forKey: "tipArray") as? [Int] ?? [] } func saveDefaults() { UserDefaults.standard.set(tipArray, forKey: "tipArray") } var tip = String() override func viewDidLoad() { super.viewDidLoad() loadDefaults() } func clearTip() { tip = String() tipAmount.text = "0" } func addToTip (value: String) { tip += value tipAmount.text = String(tip) } // 数字按钮和清空按钮的逻辑不变,这里省略 @IBAction func addToday(_ sender: Any) { let tipNum = Int(tip) ?? 0 tipArray.append(tipNum) saveDefaults() // 每次跳转新建TipTotalView实例,避免复用旧实例的问题 let vc = TipTotalView(nibName: "TipTotalView", bundle: nil) vc.tipToText = String(tipArrayTotal) // 给闭包赋值,处理清空逻辑 vc.onClearPiggy = { [weak self] in guard let self = self else { return } self.tipArray.removeAll() self.saveDefaults() print(self.tipArray) } clearTip() navigationController?.pushViewController(vc, animated: true) print(tipArray) print(tipArrayTotal) print(vc.tipToText) } }
效果说明
现在点击清空按钮后:
- 主屏幕的真实
tipArray会被清空并同步到UserDefaults - 累计总额页面的显示会即时变成0
- 后续添加小费会基于空数组重新累计,无需重启APP
内容的提问来源于stack exchange,提问作者cjshhi
相关产品推荐
相关产品推荐

