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

UITableViewCell按钮点击后无法批量添加数据至UserDefaults的问题

问题原因

你遇到的问题核心有两点:

  1. UITableViewCell的实例独立性:每个UITableViewCell都有自己独立的array1变量,每次点击按钮时,这个array1都是全新的空数组。你直接往空数组里添加当前单元格标题,再覆盖存入UserDefaults,会把之前的数据完全冲掉,最终只剩最后一次点击的Name4。
  2. 未读取已有存储数据:你没有在添加新元素前从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:31:09