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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:37:03