UITableViewCell按钮点击后无法批量添加数据至UserDefaults的问题
问题原因
你遇到的问题核心有两点:
- UITableViewCell的实例独立性:每个UITableViewCell都有自己独立的
array1变量,每次点击按钮时,这个array1都是全新的空数组。你直接往空数组里添加当前单元格标题,再覆盖存入UserDefaults,会把之前的数据完全冲掉,最终只剩最后一次点击的Name4。 - 未读取已有存储数据:你没有在添加新元素前从UserDefaults取出已保存的收藏数组,而是每次都用空数组重新操作,导致旧数据全部丢失。
解决方案
推荐把收藏逻辑移到ViewController中处理(符合iOS MVC架构,数据逻辑不应放在视图层的Cell里),具体步骤如下:
步骤1:给Cell添加点击回调闭包
在你的UITableViewCell子类中添加闭包,用于将点击事件传递给ViewController:
class YourCell: UITableViewCell { @IBOutlet weak var FeatureTitle: UILabel! // 定义回调闭包,传递当前cell的标题文本 var onFavouriteTapped: ((String) -> Void)? @IBAction func FavouriteStatusButton(_ sender: UIButton) { guard let title = FeatureTitle.text else { return } onFavouriteTapped?(title) } }
步骤2:在ViewController中统一处理收藏逻辑
在ViewController的cellForRowAt方法中,给每个cell设置回调,统一管理收藏数组:
class YourViewController: UIViewController, UITableViewDataSource { // 封装UserDefaults的读写逻辑,自动读取已有数据 var favouriteFeatures: [String] { get { UserDefaults.standard.stringArray(forKey: "ArrayOfFilteredFeatures") ?? [] } set { UserDefaults.standard.set(newValue, forKey: "ArrayOfFilteredFeatures") } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath) as! YourCell // 假设你的数据源数组是featureTitles,给cell设置标题 cell.FeatureTitle.text = featureTitles[indexPath.row] // 设置cell的点击回调 cell.onFavouriteTapped = { [weak self] title in guard let self = self else { return } // 可选:避免重复添加同一标题 if !self.favouriteFeatures.contains(title) { self.favouriteFeatures.append(title) } } return cell } }
可选:若坚持在Cell中处理(不推荐)
如果一定要在Cell里编写逻辑,每次点击前必须先读取UserDefaults中的已有数组,再添加新元素:
@IBAction func FavouriteStatusButton(_ sender: UIButton) { guard let title = FeatureTitle.text else { return } // 先读取已有的收藏数组,无数据则用空数组 var savedArray = UserDefaults.standard.stringArray(forKey: "ArrayOfFilteredFeatures") ?? [] // 可选:避免重复添加 if !savedArray.contains(title) { savedArray.append(title) UserDefaults.standard.set(savedArray, forKey: "ArrayOfFilteredFeatures") } }
注意:这种方式不符合MVC架构,数据逻辑放在视图层会导致代码耦合度高,后期维护难度大,优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者Train Lover
相关产品推荐
相关产品推荐

