没有为每个菜单项调用 validateMenuItem
validateMenuItem not called for every menu item
我的主菜单有几个菜单项(文件、编辑、查看、Window - 等等)。所有菜单项都将其操作设置为 FirstResponder
.
中的操作
该应用程序有一个 window,并且 window 是继承自 NSWindow
的类型 MyWindow
(见下文)。
请注意,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
项。
注意:Log 是日志记录框架 (SwifterLog) 的一个实例。
正确调用了所有菜单项的操作。 (也适用于未调用 validateMenuItem
的菜单项)
我不难解决这个问题(函数 menuNeedsUpdate
为所有菜单调用,可用于此),但我想知道为什么会出现这种情况。
这不是答案,而是给任何对 work-around 感兴趣的人:
@objc func menuNeedsUpdate(_ menu: NSMenu) {
Log.atDebug?.log("\(menu.title)")
... // do other stuff
menu.items.forEach( { [=10=].isEnabled = validateMenuItem([=10=]) } )
}
您还必须将必须处理的每个菜单的委托设置为 MyWindow 对象(在此示例中)。在我的示例中,菜单项 View
的菜单必须将其委托设置为 MyWindow
.
可以在这里找到答案:
validateMenuItem:
belongs to the NSMenuValidation
informal protocol;
for it to be called the relevant menu items must have a target.
我的主菜单有几个菜单项(文件、编辑、查看、Window - 等等)。所有菜单项都将其操作设置为 FirstResponder
.
该应用程序有一个 window,并且 window 是继承自 NSWindow
的类型 MyWindow
(见下文)。
请注意,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
项。
注意:Log 是日志记录框架 (SwifterLog) 的一个实例。
正确调用了所有菜单项的操作。 (也适用于未调用 validateMenuItem
的菜单项)
我不难解决这个问题(函数 menuNeedsUpdate
为所有菜单调用,可用于此),但我想知道为什么会出现这种情况。
这不是答案,而是给任何对 work-around 感兴趣的人:
@objc func menuNeedsUpdate(_ menu: NSMenu) {
Log.atDebug?.log("\(menu.title)")
... // do other stuff
menu.items.forEach( { [=10=].isEnabled = validateMenuItem([=10=]) } )
}
您还必须将必须处理的每个菜单的委托设置为 MyWindow 对象(在此示例中)。在我的示例中,菜单项 View
的菜单必须将其委托设置为 MyWindow
.
可以在这里找到答案:
validateMenuItem:
belongs to theNSMenuValidation
informal protocol; for it to be called the relevant menu items must have a target.