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



我已经被这个问题困扰了一段时间。堆栈溢出也有类似的问题,但没有一个能让我找到我正在寻找的解决方案。此外,在官方文档中似乎找不到任何信息。

我正在用程序的方式构建一个macOS应用程序。我已经通过编程设置了自己的菜单栏。我有一个NSTextView和一些NSTextfield,我已经把它们设置得非常好,作为另一个视图的子视图。除了我读过的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链接到我的窗口或文本字段和视图有关?我想在不必制作自己的撤消管理器函数的情况下进行设置。

这适用于我的系统:

// **** 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")

确保您有其他编辑菜单项。为了"撤消"某件事,你必须从一开始就"做"它。还需要正确设置txtView.allowsUndo=true。请注意Selector(someString(与#Selector((不同。这实际上是一种古老的swift语法,但它仍然有效。Swift依赖objc作为选择器。

最新更新