如何在以编程方式构建 macOS 应用程序时添加对 NSTextView 和 NSTextField 的 undo/redo 支持?
How to add undo/redo support for NSTextView and NSTextField when building a macOS application programmatically?
我已经坚持了一段时间。堆栈溢出也有类似的问题,但 none 使我找到了我正在寻找的解决方案。此外,似乎无法在官方文档中找到任何信息。
我正在以编程方式构建 macOS 应用程序。我已经以编程方式设置了自己的菜单栏。我有一个 NSTextView
和一些 NSTextfield
s,我已经将它们设置得非常好作为另一个视图的子视图。这些 类 支持除我阅读过的 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。
我已经坚持了一段时间。堆栈溢出也有类似的问题,但 none 使我找到了我正在寻找的解决方案。此外,似乎无法在官方文档中找到任何信息。
我正在以编程方式构建 macOS 应用程序。我已经以编程方式设置了自己的菜单栏。我有一个 NSTextView
和一些 NSTextfield
s,我已经将它们设置得非常好作为另一个视图的子视图。这些 类 支持除我阅读过的 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。