我的主菜单有几个菜单项(文件,编辑,视图,窗口-等等)。所有菜单项的操作均已设置为FirstResponder
中的操作。
该应用程序有一个窗口,并且该窗口的类型为MyWindow
(继承自NSWindow
(请参见下文)。
请注意,NSWindow
实现了NSMenuValidation
,因此当MyWindow
声明符合NSMenuValidation
时,它被标记为错误。
我已如下重写函数validateMenuItem
:
class MyWindow: NSWindow, NSMenuDelegate {
...
override func validateMenuItem(_ item: NSMenuItem) -> Bool {
Log.atDebug?.log("\(item.title)")
....
}
}
运行应用程序时,validateMenuItem
和File
菜单项会调用Window
函数,而Edit
和View
项不会调用。
注意:日志是日志记录框架(SwifterLog)的实例。
所有菜单项的动作均被正确调用。 (也用于未调用validateMenuItem
的菜单项)
解决这个问题对我来说并不困难(所有菜单都调用了menuNeedsUpdate
函数,并且可以为此使用),但是我想知道为什么会发生这种情况。
答案 0 :(得分:0)
这不是答案,而是对任何对解决方法感兴趣的人的答案:
@objc func menuNeedsUpdate(_ menu: NSMenu) {
Log.atDebug?.log("\(menu.title)")
... // do other stuff
menu.items.forEach( { $0.isEnabled = validateMenuItem($0) } )
}
您必须还将必须处理的每个菜单的委托设置为MyWindow对象(在此示例中)。在我的示例中,菜单项View
的菜单必须将其委托设置为MyWindow
。
答案 1 :(得分:0)
可以在这里找到答案: validateMenuItem or menuWillOpen not called for NSMenu
def print_year_born = Date.today.year - get_age puts "You were born in: " + year_born return year_born end
属于validateMenuItem:
非正式协议; 才能被称为相关菜单项必须具有目标。