macos - 如何快速访问我的 Mac OS 应用程序的 undoManager?

标签 macos swift nsundomanager

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

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

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

由于该绑定(bind)返回 nil,我想也许 ViewController 没有 undoManager,所以我在窗口中查找它:

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

唉,窗口绑定(bind)也返回 nil。对不起,我对此很陌生。谁能指出我正确的方向?我应该实现自己的 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)
}

关于macos - 如何快速访问我的 Mac OS 应用程序的 undoManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30581243/

相关文章:

mysql - 从 Mac OS x 移除 MySQL

java - 如何修复 Selenium ios 驱动程序上的 SessionNotCreatedException?

ios - 如何在 Swift 中将数据从父 View Controller 多次传递到容器 VC 子 Controller ?

ios - 网络电话 XCode 8、Swift 3 和 iOS 9.x

ios - 向下滚动以逐渐隐藏菜单栏或查看并向上滚动

objective-c - 难以实现 NSUndoManager 重做功能

ios - CoreData 撤消操作顺序,ManagedObjectContext 与手动添加的任务

macos - OSX 上的 WC - 返回包括空格

objective-c - NSUndoManager:禁用 "redo"进行破坏性操作

swift - 到一个新的 NSViewController 的 segue 应该将新的 NSViewController 显示在覆盖整个窗口的旧的之上