我在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
的行动是通过第一响应者链发送的吗?任何帮助将不胜感激。
答案 0 :(得分:1)
好的......我看到发生了什么。 AppDelegate中创建菜单项的部分每3秒调用一次(我正在使用的API的一部分)。问题是菜单项正在重新创建,因此我设置的状态并不总是菜单中的当前NSMenuItem
。
我发现我可以在NSDocument中使用validateMenuItem
来更新符合我标准的每个菜单项。
override func validateMenuItem(menuItem: NSMenuItem) -> Bool {
menuItem.state = workspaceIndex == menuItem.tag ? NSOnState : NSOffState
return true
}