如何在Swift中的UITableView for Core Data App中保存复选标记状态

时间:2016-03-10 21:26:11

标签: ios swift uitableview core-data nsuserdefaults

我已经使用Core Data实现了一个列表应用程序。我想要做的是添加复选标记,以便用户可以单击一个单元格并显示一个勾号以显示它已完成。

我不知道如何保存这些复选标记,因此当应用关闭并打开或重新启动时,检查仍将在特定单元格上。我应该使用CoreData还是NSUserDefaults来实现它?我将如何使用这些来实现它?

以下是目前的代码:

cellForRowAtIndex:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell")! as UITableViewCell
    let item = Items[indexPath.row]
    cell.textLabel?.item = task.valueForKey("item") as? String

    return cell
}

DidSelectRowAtIndex:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {


    let selectedRow:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!

    if selectedRow.accessoryType == UITableViewCellAccessoryType.None {

        selectedRow.accessoryType = UITableViewCellAccessoryType.Checkmark

        selectedRow.tintColor = UIColor.greenColor()

    } else {

        selectedRow.accessoryType = UITableViewCellAccessoryType.None

    } 
} 

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您需要跟踪数据模型(核心数据对象)中的完成状态,而不是单元格。如您所发现的那样重新使用单元格,也不会保留单元格,因此不会保存复选标记状态。

我会用这样的东西:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let taskObject=self.listItems[indexPath.row]
    var taskStatus = taskObject.valueForKey("completed") as? Bool ?? false

    taskObject.setValue(!taskStatus,forKey:"completed") // Toggle completed status

    do {
        try managedContext.save()
    } catch let error as NSError {
        print("Cannot save object: \(error), \(error.localizedDescription)")
    }

    tableView.deselectRowAtIndexPath(indexPath,animated:false)

    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
}

然后,在cellForRowAtIndexPath中,您可以适当地渲染行:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("listCell") as! UITableViewCell
    let task = listItems[indexPath.row]
    let taskStatus = task.valueForKey("completed") as! Bool
    cell.textLabel?.text = task.valueForKey("task") as? String

    var accessoryType=UITableViewCellAccessoryType.None
    var tintColor = UIColor.clearColor()

    if (taskStatus) {
         accessoryType=UITableViewCellAccessoryType.Checkmark
         tintColor = UIColor.greenColor()
    }

    cell.accessoryType=accessoryType
    cell.tintColor = tintColor

    return cell
}