如何在以编程方式构建 macOS 应用程序时添加对 NSTextView 和 NSTextField 的 undo/redo 支持?

How to add undo/redo support for NSTextView and NSTextField when building a macOS application programmatically?

我已经坚持了一段时间。堆栈溢出也有类似的问题,但 none 使我找到了我正在寻找的解决方案。此外,似乎无法在官方文档中找到任何信息。

我正在以编程方式构建 macOS 应用程序。我已经以编程方式设置了自己的菜单栏。我有一个 NSTextView 和一些 NSTextfields,我已经将它们设置得非常好作为另一个视图的子视图。这些 类 支持除我阅读过的 undo/redo 功能外的所有功能。我有 myTextView.allowsUndo = true 但它不起作用。为什么撤消管理器不会自动执行我非常确定它应该执行的操作?

这是我的菜单代码的相关部分:

let editMenu = NSMenuItem()
editMenu.submenu = NSMenu(title: "Edit")
editMenu.submenu?.items = [
NSMenuItem(title: "Undo", action: #selector(UndoManager.undo), keyEquivalent: "z"),
NSMenuItem(title: "Redo", action: #selector(UndoManager.redo), keyEquivalent: "Z")
]

我认为这可能与将 UndoManager 链接到我的 window 或文本字段和视图有关?我想设置它而不必创建我自己的撤消管理器功能。

这适用于我的系统:

// **** Edit Menu **** //
 let editMenu = NSMenuItem()
  editMenu.submenu = NSMenu(title: "Edit")
  editMenu.submenu?.addItem(withTitle: "Undo", action: Selector(("undo:")), keyEquivalent: "z")
  editMenu.submenu?.addItem(withTitle: "Redo", action: Selector(("redo:")), keyEquivalent: "Z")
  editMenu.submenu?.addItem(.separator())
  editMenu.submenu?.addItem(withTitle: "Cut", action: #selector(NSText.cut(_:)), keyEquivalent: "x")
  editMenu.submenu?.addItem(withTitle: "Copy", action: #selector(NSText.copy(_:)), keyEquivalent: "c")
  editMenu.submenu?.addItem(withTitle: "Paste", action: #selector(NSText.paste(_:)), keyEquivalent: "v")
  editMenu.submenu?.addItem(withTitle: "Select All", action: #selector(NSText.selectAll(_:)), keyEquivalent: "a")

确保您有其他编辑菜单项。为了 'undo' 你必须 'do' 它开始。还需要正确设置 txtView.allowsUndo = true 。请注意 Selector(someString) 不同于#selector()。它实际上是旧的 swift 语法,但它仍然有效。 Swift 选择器依赖于 objc。