我想在我的应用程序中实现撤销/重做操作。撤销/重做操作需要记录每个文档,而不是在UIViewController级别。所以我需要把UndoManager放在实现自定义文档的类中。但其中一个要求是,撤销/重做应该是可能的,即使在应用程序重新启动,这意味着UndoManager必须是持久的。我们如何使unmanager状态持久化?
据我所知,该UndoManager不直接关系到你的数据模型,因此不直接关系到你的应用程序状态-即数据模型状态。它只允许您注册一些操作,这些操作将以撤销/重做的方式更改数据模型。为了实现持久性,在使用UndoManager时,您必须使用一些持久性存储(像Core Data或Realm这样的数据库,或者对于非常简单的状态,您可以使用UserDefaults)。您必须使用在UndoManager中注册的操作来更新您选择使用的持久存储。此外,您必须以某种方式跟踪数据库中的更改,以便您可以在应用程序启动之间恢复和注册它们。
我在网上找到的一个例子,描述了撤消/重做动作注册-取自这个例子- https://medium.com/flawless-app-stories/undomanager-in-swift-5-with-simple-example-8c791e231b87
//MARK:- Add/Remove Student : Undo/Redo Actions
// Register inverse Actions that automatically performs
extension StudentsListViewController {
func addNewStudentUndoActionRegister(at index: Int){
self.undoManager?.registerUndo(withTarget: self, handler: { (selfTarget) in
selfTarget.removeNewStudent(at: index)
selfTarget.removeNewStudentUndoActionRegister(at: index)
})
}
func removeNewStudentUndoActionRegister(at index: Int){
self.undoManager?.registerUndo(withTarget: self, handler: { (selfTarget) in
selfTarget.addNewStudent(at: index)
selfTarget.addNewStudentUndoActionRegister(at: index)
})
}
}
正如你所看到的,动作只会改变状态,而UndoManager并不会跟踪状态,只会跟踪动作…
一些个人看法:对于复杂的逻辑和状态,我个人喜欢使用一些状态管理框架,如Redux(或Swift等效的ReSwift),在这种情况下,我可以很容易地创建一个撤销/重做动作。并且您可以轻松地在应用程序生命周期中保存状态记录,并将其记录到持久存储中,例如,使您的状态可编码并在存储中保存它的堆栈。这有点像使用UndoManager的目的——但据我所知,你不能把注册的动作保存到磁盘上。