我没有使用storyboard和xib,只使用了代码。 我想以编程方式添加“编辑”菜单。我的问题是
1)如何显示“编辑”菜单/在评论时需要输入什么代码问题1)?
2)有任何快速提供的动作,如copy&粘贴?
class TestManager: NSObject {
// ....
override init() {
let editMenuItems = [
NSMenuItem(title: "Cut", action: nil(/* Question 2) */), keyEquivalent: ""),
NSMenuItem(title: "Copy", action: nil, keyEquivalent: ""),
NSMenuItem(title: "Paste", action: nil, keyEquivalent: ""),
]
for editMenuItem in editMenuItems {
self.editMenu.addItem(editMenuItem)
}
// Qustion 1) .. show "Edit" Menu
}
}
答案 0 :(得分:6)
您不会显示self.editMenu
的来源。
在任何情况下,您都需要从mainMenu
实例获取NSApplication
并将菜单项添加到以菜单作为子菜单的菜单项。所以,像:
var editMenuItem = NSMenuItem()
editMenuItem.title = "Edit"
var mainMenu = NSMenu()
mainMenu.addItem(editMenuItem)
mainMenu.setSubmenu(self.editMenu, forItem:editMenuItem)
NSApplication.sharedApplication().mainMenu = mainMenu
我不在Swift工作,因此可能会有一些错误。
至于用于编辑菜单项的操作选择器,最简单的方法是创建一个主菜单NIB来检查它。查看用于现成“编辑”菜单的菜单项的操作选择器。例如,您会发现“复制”项目使用copy:
选择器。这可以在Swift中表示为一个字符串"copy:"
。
答案 1 :(得分:0)
启用自动菜单
- 如果未设置菜单项的目标 (即,如果菜单项已连接到First Responder,则为nil,并且NSMenu对象不是上下文菜单,然后NSMenu 使用响应者链(在响应者链中描述)来确定目标。如果响应者链中有无对象来实现项目的操作,则该项目已禁用。 如果响应者链中有一个对象来实现该项的操作,则NSMenu会检查该对象是否实现了
validateMenuItem:
或validateUserInterfaceItem:
方法。如果不,则菜单项启用。如果是,则菜单项的启用状态 由方法的返回值确定。
因此,为了实现标准系统菜单项的自动菜单启用,我们必须指定正确的action
而不设置target
。< / p>
let menu = NSMenu(...)
menu.addItem(withTitle: "Quit \(applicationName)",
action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q")
menu.addItem(withTitle: "Select All",
action: #selector(NSText.selectAll(_:)), keyEquivalent: "a")
menu.addItem(withTitle: "Copy",
action: #selector(NSText.copy(_:)), keyEquivalent: "c")