Для отмены / возврата мы не используем UndoManager. Однако мы все еще хотели бы получить поддержку жестов. Для вырезания, копирования и вставки это просто: нам просто нужно переопределить эти методы на первом респонденте.
Для отмены / повтора я попытался переопределить undoManager и вернуть следующий класс:
class TomdoManager: UndoManager {
override func undo() {
print(#function)
}
override func redo() {
print(#function)
}
internal var isUndoEnabled = false
override var canUndo: Bool {
print(#function)
return true
}
internal var isRedoEnabled = false
override var canRedo: Bool {
print(#function)
return true
}
override func prepare(withInvocationTarget target: Any) -> Any {
return self
}
override func beginUndoGrouping() {
print(#function)
}
override func endUndoGrouping() {
print(#function)
}
override var groupingLevel: Int {
print(#function)
return 1
}
override func disableUndoRegistration() {
print(#function)
}
override func enableUndoRegistration() {
print(#function)
}
override var isUndoRegistrationEnabled: Bool {
print(#function)
return true
}
// override var groupsByEvent: Bool {
// return true
// }
// override var levelsOfUndo: Int {
// print(#function)
// return 1
// }
// override var runLoopModes: [RunLoop.Mode] {
// print(#function)
// return [.common]
// }
override func undoNestedGroup() {
print(#function)
}
override var isUndoing: Bool {
print(#function)
return false
}
override var isRedoing: Bool {
print(#function)
return false
}
override func removeAllActions() {
print(#function)
}
override func removeAllActions(withTarget target: Any) {
print(#function)
}
override func registerUndo(withTarget target: Any, selector: Selector, object anObject: Any?) {
print(#function)
}
override func __registerUndoWithTarget(_ target: Any, handler undoHandler: @escaping (Any) -> Void) {
print(#function)
}
override func setActionIsDiscardable(_ discardable: Bool) {
print(#function)
}
override var undoActionIsDiscardable: Bool {
print(#function)
return true
}
override var redoActionIsDiscardable: Bool {
print(#function)
return true
}
override var undoActionName: String {
print(#function)
return "Undo"
}
override var redoActionName: String {
print(#function)
return "Redo"
}
override func setActionName(_ actionName: String) {
print(#function)
}
override var undoMenuItemTitle: String {
print(#function)
return "Undo Menu"
}
override var redoMenuItemTitle: String {
print(#function)
return "Redo Menu"
}
override func undoMenuTitle(forUndoActionName actionName: String) -> String {
print(#function)
return "Undo menu action"
}
override func redoMenuTitle(forUndoActionName actionName: String) -> String {
print(#function)
return "Redo menu action"
}
}
Когда я вызываю меню отмены / возврата одним касанием тремя пальцами, я вижу, что вызывается canUndo, но независимо от того, что я возвращаю, жесты никогда не работают и никакие другие методы не вызываются. Кроме того, когда я делаю три пальца или влево или вправо, вызывается canUndo. Никаких других методов не вызывается.
Есть идеи?