如何通过UIButton重置UITableView单元格以加载更新后的UserDefaults数据?
解决单元格无法刷新UserDefaults数据的问题
你的问题出在两个核心点:一是WeatherForecastCells作为lazy数组,只会在第一次访问时读取UserDefaults的初始数据,之后UserDefaults更新后,数组内的内容不会自动同步;二是没有触发TableView重新加载单元格,导致界面始终显示旧数据。
直接给你可行的实现方案:
- 重构数据源加载逻辑
把原来的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)] } // ... 保留你原有的其他代码 }
- 实现按钮的刷新动作
在按钮的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
相关产品推荐
相关产品推荐

