Swift中的NSMenu选择器

时间:2014-06-23 18:38:07

标签: swift

我不知道为什么这不起作用。菜单显示,但如果我将autoenablesItems保留为默认值,则显示为灰色,如果我将其设置为false,则不会调用操作。

class GameScene: SKScene {
    // ...
    func action1(sender: AnyObject) {
        println("Urk, action 1")
    }

    func action2(sender: AnyObject) {
        println("Urk, action 2")
    }

    func popUpMenu(#event: NSEvent) {
        var theMenu = NSMenu(title: "Contextual menu")
        theMenu.addItemWithTitle("Action 1", action: Selector("action1:"), keyEquivalent: "")
        theMenu.addItemWithTitle("Action 2", action: Selector("action2:"), keyEquivalent: "")
        //theMenu.autoenablesItems = false
        NSMenu.popUpContextMenu(theMenu, withEvent:event, forView:self.view)
    }

    override func mouseDown(theEvent: NSEvent) {
        self.popUpMenu(event: theEvent) // The menu shows
    }
}

更新

根据@ Chuck的回答,您需要执行以下操作:

func popUpMenu(#event: NSEvent) {
    var theMenu = NSMenu(title: "Contextual menu")
    theMenu.addItemWithTitle("Action 1", action: Selector("action1:"), keyEquivalent: "")
    theMenu.addItemWithTitle("Action 2", action: Selector("action2:"), keyEquivalent: "")

    for item: AnyObject in theMenu.itemArray {
        if let menuItem = item as? NSMenuItem {
            menuItem.target = self
        }
    }

    NSMenu.popUpContextMenu(theMenu, withEvent:event, forView:self.view)
}

1 个答案:

答案 0 :(得分:6)

听起来您的问题是使用该方法创建的NSMenuItem没有接收器,因此它使用响应器链,并且此对象不在响应器链中。您可以通过设置菜单项来强制它查看您的对象。目标是self