Xcode 12 Swift 5 如何保存TableView单元格的Checkmark勾选状态
解决方案
你现有代码的核心逻辑已经完全覆盖了勾选状态持久化的需求,只需要补全两处遗漏即可正常运行:
1. 确认ShoppingList模型遵守Codable协议
你的持久化逻辑用了JSON编解码,需要确保模型符合协议要求,示例定义如下:
struct ShoppingList: Codable { let itemName: String var checkmarkState: Bool = false // 新增条目默认未勾选 }
如果之前没有加Codable遵守声明,JSON编解码会静默失败,导致数据无法持久化。
2. 清空列表方法补全save调用
你现有的clearList()方法只清空了数组、刷新了列表,没有调用持久化逻辑,修改为:
@objc func clearList() { shoppingList.removeAll(keepingCapacity: true) save() // 新增这行,同步清空本地存储 tableView.reloadData() }
可选优化点
你在didSelectRowAt里直接操作cell的accessoryType是可以的,更严谨的写法是只改数据源,然后刷新对应行,避免cell复用带来的异常:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) shoppingList[indexPath.row].checkmarkState.toggle() save() tableView.reloadRows(at: [indexPath], with: .automatic) }
修改完成后,勾选状态会跟着条目数据一起保存在UserDefaults中,应用重启后会自动读取展示。
内容的提问来源于stack exchange,提问作者Shyam Sundar
相关产品推荐
相关产品推荐

