不是每个菜单项都调用validateMenuItem

时间:2019-07-02 09:25:16

标签: swift macos cocoa menu

我的主菜单有几个菜单项(文件,编辑,视图,窗口-等等)。所有菜单项的操作均已设置为FirstResponder中的操作。

该应用程序有一个窗口,并且该窗口的类型为MyWindow(继承自NSWindow(请参见下文)。

请注意,NSWindow实现了NSMenuValidation,因此当MyWindow声明符合NSMenuValidation时,它被标记为错误。

我已如下重写函数validateMenuItem

class MyWindow: NSWindow, NSMenuDelegate {

    ...

    override func validateMenuItem(_ item: NSMenuItem) -> Bool {
        Log.atDebug?.log("\(item.title)")
        ....
    }
}

运行应用程序时,validateMenuItemFile菜单项会调用Window函数,而EditView项不会调用。

注意:日志是日志记录框架(SwifterLog)的实例。

所有菜单项的动作均被正确调用。 (也用于未调用validateMenuItem的菜单项)

解决这个问题对我来说并不困难(所有菜单都调用了menuNeedsUpdate函数,并且可以为此使用),但是我想知道为什么会发生这种情况。

2 个答案:

答案 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:非正式协议; 才能被称为相关菜单项必须具有目标