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

如何通过UIButton重置UITableView单元格以加载更新后的UserDefaults数据?

解决单元格无法刷新UserDefaults数据的问题

你的问题出在两个核心点:一是WeatherForecastCells作为lazy数组,只会在第一次访问时读取UserDefaults的初始数据,之后UserDefaults更新后,数组内的内容不会自动同步;二是没有触发TableView重新加载单元格,导致界面始终显示旧数据。

直接给你可行的实现方案:

  1. 重构数据源加载逻辑
    把原来的lazy数组改成普通数组,新增一个专门刷新数据的方法,每次需要时从UserDefaults重新读取最新值:
class WeatherFeatures: UIViewController, UITextViewDelegate, WeatherManagerDelegate {
    // 无需重复创建UserDefaults实例,直接用全局的standard即可
    private var weatherForecastCells: [WeatherCell] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 页面初始化时加载一次数据
        refreshWeatherData()
    }
    
    // 刷新数据源的方法
    private func refreshWeatherData() {
        guard let date1 = UserDefaults.standard.string(forKey: "Date1") else { return }
        let low1 = Int(UserDefaults.standard.double(forKey: "Low1"))
        let high1 = Int(UserDefaults.standard.double(forKey: "High1"))
        
        weatherForecastCells = [WeatherCell(image: "", date: date1, low: low1, high: high1)]
    }
    
    // ... 保留你原有的其他代码
}
  1. 实现按钮的刷新动作
    在按钮的IBAction里,先刷新数据源,再调用TableView的reloadData()方法,让TableView重新加载所有单元格:
@IBAction func resetMyCells(_ sender: UIButton) {
    refreshWeatherData()
    tableView.reloadData()
}

这样每次点击按钮时,都会重新从UserDefaults读取最新数据,TableView会重新调用cellForRowAt方法,用新数据更新单元格的显示内容。

额外补充:如果想实现UserDefaults数据变化时自动刷新(比如切换地点后不用手动点按钮),可以监听UserDefaults的变化通知,在viewDidLoad里添加:

NotificationCenter.default.addObserver(self, selector: #selector(refreshWeatherData), name: UserDefaults.didChangeNotification, object: nil)

记得在页面销毁时移除观察者:

deinit {
    NotificationCenter.default.removeObserver(self)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:15:14