Я не могу воспроизвести любую проблему сейчас, когда вы сделали разумным свой код отмены регистрации. Вот весь код тестового приложения (я не знаю, что такое аннотация, поэтому я просто использовал String):
import Cocoa
class MyResponder : NSResponder {
private let _undoManager = UndoManager()
override var undoManager: UndoManager {
return _undoManager
}
typealias Annotation = String
var annotations = ["hello"]
func setAnnotations(_ newAnnotations: [Annotation]) {
let currentAnnotations = self.annotations
self.undoManager.registerUndo(withTarget: self, handler: { (selfTarget) in
selfTarget.setAnnotations(currentAnnotations)
})
self.annotations = newAnnotations
}
}
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
let myResponder = MyResponder()
@IBOutlet weak var window: NSWindow!
func applicationDidFinishLaunching(_ aNotification: Notification) {
print(self.myResponder.annotations)
self.myResponder.setAnnotations(["howdy"])
print(self.myResponder.annotations)
self.myResponder.undoManager.undo()
print(self.myResponder.annotations)
}
}
Вывод:
["hello"]
["howdy"]
["hello"]
Так что Undo работает отлично. Если это не происходит для вас, возможно, вы каким-то образом неправильно управляете своим «классом моделей».
Кстати, правильнее написать закрытие регистрации так:
self.undoManager.registerUndo(withTarget: self, handler: {
[currentAnnotations = self.annotations] (selfTarget) in
selfTarget.setAnnotations(currentAnnotations)
})
Это гарантирует, что self.annotations
не будет захвачено преждевременно.