如何以编程方式添加NSMenu?

时间:2015-02-28 12:59:39

标签: macos swift nsmenu nsmenuitem

我没有使用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
    }
}

2 个答案:

答案 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)

  

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html

     

启用自动菜单

     
      
  • 如果未设置菜单项的目标 (即,如果菜单项已连接到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")