如何在 swift 中访问我的 Mac OS 应用程序的 undoManager?

How do I access the undoManager for my Mac OS app in swift?

我只是想让撤消对用户在我的应用程序中执行的操作起作用。默认情况下,用户所做的任何文本编辑都具有撤消的好处,但是以其他方式(从我的代码)完成的任何操作都没有。

我可以看到文档解释说我需要获取 NSUndoManager 的实例并调用 registerUndoWithTarget,但我对第一步感到困惑:从我的 ViewController 中获取 undoManager。由于 ViewController 是一个 UIResponder,我试过这个:

if let undoManager = self.undoManager {
            undoManager.registerUndoWithTarget(self, selector: Selector("removeLatestEntry:"), object: "test")
        }

由于绑定 returns 为零,我想也许 ViewController 没有 undoManager,所以我在 window:

中查找它
if let window = NSApplication.sharedApplication().mainWindow {
        if let undoManager = window.undoManager {
            undoManager.registerUndoWithTarget(self, selector: Selector("removeLatestEntry:"), object: "test")
        }
    }

唉,window 绑定也 returns 没有。对不起,我对此很陌生。谁能指出我正确的方向?我应该实现自己的 undoManager 还是什么?某处显然有一个 undoManager,因为用户在我的 textField 中手动执行的任何操作都会出现撤消行为。这似乎是一个我可以从 ViewController.

轻松访问的单例

-- 编辑:顺便说一句,上面的代码放在 viewDidLoad 中,而 removeLatestEntry 只是我 ViewController 中的一个函数,它接受一个字符串并在此时打印它。

要使用 undoManager,ViewController 需要成为第一响应者。所以:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    becomeFirstResponder()
}

然后,无论在何处定义需要撤消的操作,您都可以注册撤消并传递撤消该操作所需的任何内容。所以就我而言:

func addEntry(activity: String) {
    // some other stuff…
    undoManager!.registerUndoWithTarget(self, selector: Selector("removeLatestEntry:"), object: activity)
}