如何在单元格中保存Checkmark附件

时间:2017-07-28 20:37:53

标签: ios swift uitableview

尝试开发一个清单应用程序并且一直试图保存复选标记的状态。当我离开tableView并返回时,所有已保存的复选标记都将被删除。我导入了UKIT然后定义了这个类。

这是我的代码:

unittest/main.py

我已经将NSCoder视为一种解决方案,但似乎无法让它正常工作。任何帮助表示赞赏!

4 个答案:

答案 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
}