没有为每个菜单项调用 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 函数会为 FileWindow 菜单项调用,但不会为 EditView 项。

注意: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.