我有主菜单有几个菜单项(文件,编辑,查看,窗口-更多)。所有菜单项的操作都设置为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,并可用于此),但我想知道为什么会发生这种行为。
发布于 2020-03-10 12:17:13
答案可以在这里找到:validateMenuItem or menuWillOpen not called for NSMenu
validateMenuItem:属于NSMenuValidation非正式协议;要将其称为相关菜单项,必须有一个目标。
发布于 2019-07-02 17:36:34
这不是一个答案,而是对任何对解决问题感兴趣的人来说:
@objc func menuNeedsUpdate(_ menu: NSMenu) {
Log.atDebug?.log("\(menu.title)")
... // do other stuff
menu.items.forEach( { $0.isEnabled = validateMenuItem($0) } )
}必须将必须处理的每个菜单的委托设置为MyWindow对象(在本例中)。在我的示例中,菜单项View的菜单必须将其委托设置为MyWindow。
https://stackoverflow.com/questions/56849263
复制相似问题