registerUndo(withTarget:selector:object:)
Registers the selector of the specified target to implement a single undo operation that the target receives.
Declaration
func registerUndo(withTarget target: Any, selector: Selector, object: Any?)Parameters
- target:
The target of the undo operation.
The undo manager maintains an unowned reference to
targetto prevent retain cycles. - selector:
The selector for the undo operation.
- object:
The argument sent with the selector.
The undo manager maintains a strong reference to
anO``bject.
Discussion
Use registerUndo(withTarget:selector:object:) to register a selector for an undo operation. To register a selector on the undo stack, you also need to make the method available to the Objective-C runtime by applying the @objc attribute to the method. For more on how to create a selector, see Selectors.
Calling this method also clears the redo stack.
The following example demonstrates how to register and use a selector on the undo stack by modeling a Garden class with two methods: plant(flower:) and pluck(flower:). The plant(flower:) method removes a flower from the garden while pluck(flower:) adds a flower such that effectively, the two methods are inverse operations of each other. This inverse quality makes it ideal to register plant(flower:) and pluck(flower:) to be each other’s undo operation.
class Garden {
typealias FlowerName = String
var flowers: [FlowerName: Int]
var manager = UndoManager()
init(flowers: [FlowerName: Int]) {
self.flowers = flowers
}
@objc func plant(flower: FlowerName) {
flowers[flower, default: 0] += 1
manager.registerUndo(withTarget: self, selector: #selector(pluck), object: flower)
}
@objc func pluck(flower: FlowerName) {
flowers[flower, default: 0] -= 1
manager.registerUndo(withTarget: self, selector: #selector(plant), object: flower)
}
}
var garden = Garden(flowers: ["orchid" : 2, "lavender": 1, "violet": 2])
garden.pluck(flower: "orchid")
//garden.flowers == ["orchid" : 1, "lavender": 1, "violet": 2]
garden.manager.undo()
//garden.flowers == ["orchid" : 2, "lavender": 1, "violet": 2]See Also
Related Documentation
undoNestedGroup()groupingLevel- Introduction to Undo Architecture