尝试开发一个清单应用程序并且一直试图保存复选标记的状态。当我离开tableView并返回时,所有已保存的复选标记都将被删除。我导入了UKIT然后定义了这个类。
这是我的代码:
unittest/main.py
我已经将NSCoder视为一种解决方案,但似乎无法让它正常工作。任何帮助表示赞赏!
答案 0 :(得分:1)
以下是我将如何处理它,如果您遵循整个解决方案,即使应用关闭,它也会保存。
按照以下类型关闭Bool类型:var checkmarks = [Int : Bool]()
然后,在cellForRow函数中,添加:
if checkmarks[indexPath.row] != nil {
cell.accessoryType = checkmarks[indexPath.row] ? .checkmark : .none
} else {
checkmarks[indexPath.row] = false
cell.accessoryType = .none
}
在didSelectRow函数中,添加:
if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
if cell.accessoryType == .checkmark{
cell.accessoryType = .none
checkmarks[indexPath.row] = false
}
else{
cell.accessoryType = .checkmark
checkmarks[indexPath.row] = true
}
}
如果您希望在应用关闭时保存,则必须通过执行以下操作将Checkmarks数组保存在UserDefaults中:
在didSelectRow函数中,在所有内容添加后的底部:
UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: checkmarks), forKey: "checkmarks")
UserDefaults.standard.synchronize()
然后,在viewDidLoad中,添加:
if let checks = UserDefaults.standard.value(forKey: "checkmarks") as? NSData {
checkmarks = NSKeyedUnarchiver.unarchiveObject(with: checks as Data) as! [Int : Bool]
}
如果您有任何疑问,请与我联系。
修改强> 所以我完全忘记的是[Int:Bool]不是NSDictionary,它只是一个词典。 UserDefaults不能存储Dictionary对象,只能存储NSDictionary,这就是为什么你必须将它改为NSData才能保存[Int:Bool]。希望这次有效:)
答案 1 :(得分:0)
您可以根据tableView行上选中的复选标记在数组中保存索引路径。
答案 2 :(得分:0)
根据您的实现,UITableViewCell将被重复使用,标识符为“List1”。因此,如果您想重新使用单元格,则必须通过将状态存储在预定义任务中来不断更新正确的accessoryType。
答案 3 :(得分:0)
由于单元格被卸载并稍后重新使用,因此您需要将复选标记的状态存储在其他位置。在此示例中,名为preDefinedTaskCheckmarkState
的数组。加载单元格时,您还需要设置复选标记状态。
var PreDefinedTasks = ["1", "2", "3", "4"]
var preDefinedTaskCheckmarkState = [Bool](repeating: false, count: 4)
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
preDefinedTaskCheckmarkState[indexPath.row] = !(cell.accessoryType == .checkmark)
cell.accessoryType = preDefinedTaskCheckmarkState[indexPath.row] ? .checkmark : .none
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return PreDefinedTasks.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "List1", for: indexPath)
cell.textLabel?.text = PreDefinedTasks[indexPath.row]
cell.accessoryType = preDefinedTaskCheckmarkState[indexPath.row] ? .checkmark : .none
return cell
}