Итак,
Мне удалось это сделать (с помощью 5-летней Книги от Мэтта Нойбурга!) Итак, нечего делать в viewController, я удалил сталиFirstResponder и motionEnded.
Все в классе SnowFlake: я добавил
let undoer = UndoManager()
override var undoManager : UndoManager? {
return self.undoer
}
override var canBecomeFirstResponder: Bool { return true }
Итак, я сообщаю об используемом мной undoManager, и класс (представление здесь) может стать firstResponder
после манипуляции с для просмотра, который можно отменить (в моем случае в touchesEnded
), я вызываю
self.becomeFirstResponder()
Я удалил функцию undoLastAction (теперь бесполезно) и изменил действие отмены на функцию
changePathUndoable(newPathPoints: finalPathPoints)
функция такая:
func changePathUndoable(newPathPoints: [CGPoint]) {
let oldPathPoints = Snowflake.sharedInstance.pathPoints
Snowflake.sharedInstance.pathPoints = newPathPoints
// Action du undo
undoer.setActionName("cutting")
undoer.registerUndo(withTarget: self, handler: { (targetSelf) in
targetSelf.changePathUndoable(newPathPoints: oldPathPoints)
})
Snowflake.sharedInstance.createPath()
self.setNeedsDisplay()
}
Мне пришлось создать функцию changePathUndoable вместо прямого вызова undoer.registerUndo только для того, чтобы сработало действие redo (я раньше не проверял redo).
Я думаю, что все шаги необходимы, чтобы сделать то, что я хотел: заставить представление получить событие встряхивания, отобразить это диалоговое окно и быть в состоянии отменить / повторить изменения.