NSMenuItem设置状态不起作用

时间:2016-02-01 04:51:27

标签: swift macos cocoa nsmenuitem

我在Swift 1.2中有一个基于文档的应用程序。我希望以编程方式生成NSMenuItem,其中包含对当前NSDocument的操作,然后检查该选择。这是我到目前为止所做的:

的AppDelegate

// generate items
for thing in thingArray {
    var newThing = NSMenuItem(title:name, action: Selector("myMethod:"), keyEquivalent: "")
    newThing.enabled = true
    submenu.addItem(newThing)
}

myDocument中

// getting current AppDelegate
let app = NSApplication.sharedApplication().delegate as! AppDelegate

// called by user selected menu item
@IBAction func myMethod(sender: NSMenuItem) {
    let parent = sender.parentItem!

    // iterate through all Items to setState: NSOffState

    for item in parent.submenu!.itemArray as! [NSMenuItem] {
        if workspace?.name == item.title {
            item.state = NSOnState     
            break
        }
    }
}

我知道item.state之前的所有代码都在运行。我把打印日志测试一下。但是,通常情况下,菜单项不会被检查,但偶尔会检查。

我最好的猜测是菜单不爽,但我不知道该怎么做。也可能是NSMenuItem的行动是通过第一响应者链发送的吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的......我看到发生了什么。 AppDelegate中创建菜单项的部分每3秒调用一次(我正在使用的API的一部分)。问题是菜单项正在重新创建,因此我设置的状态并不总是菜单中的当前NSMenuItem

我发现我可以在NSDocument中使用validateMenuItem来更新符合我标准的每个菜单项。

override func validateMenuItem(menuItem: NSMenuItem) -> Bool {
    menuItem.state = workspaceIndex == menuItem.tag ? NSOnState : NSOffState
    return true
}