Chapter 26. Undo
The idea of undo is that the user can reverse a recently performed action. Behind the scenes, the app maintains an internal stack of undoable actions; undoing reverses the action at the top of the stack, and also makes that action available for redo through a secondary stack.
A pervasive undo capability is characteristic primarily of desktop macOS applications, but some iOS apps may also benefit from a limited undo facility, and certain built-in views — in particular, those that involve text entry (Chapter 11) — implement it already. UIDocument (see Chapter 23) integrates with your undo facility to update the document’s “dirty” state automatically.
Undo operates through an undo manager — an instance of UndoManager. Every time the user performs an action that is to be undoable, you register that action with the undo manager. When the user asks to undo, you send
undo to the undo manager; when the user asks to redo, you send
redo to the undo manager. In both cases, the undo manager performs the registered action and adjusts its internal undo and redo stacks appropriately.
I’ll introduce the UndoManager class with a simple example; for more information, read Apple’s Undo Architecture in the documentation archive, along with the class documentation.
I’ll illustrate an UndoManager for a simple app that has just one kind of undoable action. In my example, the user can drag a small square around the screen. Our goal is to make the drag undoable.