如何在tableviewcell中执行撤消功能?

时间:2018-03-19 17:41:13

标签: swift uitableview undo-redo

我无法使用我的撤消按钮。我试图将它移到如果你按下tableview单元格上的删除按钮,撤消可以重新进入单元格。

我的撤消:

@IBAction func undoBtnWasPressed(_ sender: Any) {
        undoItem()
        undoView.isHidden = true
    }

    func undoItem() {
        undoManager?.registerUndo(withTarget: GoalCell.self, selector: #selector(removeGoal(atIndexPath:)), object: nil)
        undoManager?.undo()
    }

我的删除:

@objc func removeGoal(atIndexPath indexPath: IndexPath) {
        guard let managedContext = appDelegate?.persistentContainer.viewContext else { return }
        managedContext.delete(goals[indexPath.row])
        undoView.isHidden = false

        do {
            try managedContext.save()
            print("Successfully removed goal.")
        } catch {
            debugPrint("Could not save: \(error.localizedDescription)")
        }
    }

1 个答案:

答案 0 :(得分:1)

您可以将已删除单元格的数据源中的数据保存在属性或数组中,如果按下撤消按钮,则会将数据重新添加到数据源中并重新加载行或表格视图的完整数据

修改

例如,在您的示例中,您使用删除功能根据goals[indexPath.row]从核心数据中删除数据 在删除之前,将内容从goals[indexPath.row]保存到单独的阵列中。 在点击撤消时,只需从单独的数组中获取值并将其添加回goals并将其添加回核心数据。

然后只需tableview.reloadData()

编辑2:

let dataSource: [CustomObject] = [Object1, Object2, Object3]
var undoSource: [CustomObject] = []

func removeRow(indexPath) {
    let object = dataSource[indexPath.row]
    undoSource.append(object)
    dataSource.remove(object)
}

func undo() {
    for object in undoSource {
        dataSource.append(object)
    }
    tableView.reloadData()
}