首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >validateMenuItem不是为每个菜单项调用的

validateMenuItem不是为每个菜单项调用的
EN

Stack Overflow用户
提问于 2019-07-02 09:25:16
回答 2查看 498关注 0票数 1

我有主菜单有几个菜单项(文件,编辑,查看,窗口-更多)。所有菜单项的操作都设置为FirstResponder中的操作。

应用程序只有一个窗口,该窗口的类型是从MyWindow继承的NSWindow (见下文)。

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

我已经将函数validateMenuItem重写如下:

代码语言:javascript
复制
class MyWindow: NSWindow, NSMenuDelegate {

    ...

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

当我运行应用程序时,validateMenuItem函数是为FileWindow菜单项调用的,而不是针对EditView项调用的。

注意:日志是日志框架(SwifterLog)的一个实例。

所有菜单项的操作都被正确调用。(也适用于未调用validateMenuItem的菜单项)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-10 12:17:13

答案可以在这里找到:validateMenuItem or menuWillOpen not called for NSMenu

validateMenuItem:属于NSMenuValidation非正式协议;要将其称为相关菜单项,必须有一个目标

票数 0
EN

Stack Overflow用户

发布于 2019-07-02 17:36:34

这不是一个答案,而是对任何对解决问题感兴趣的人来说:

代码语言:javascript
复制
@objc func menuNeedsUpdate(_ menu: NSMenu) {

    Log.atDebug?.log("\(menu.title)")

    ...    // do other stuff    

    menu.items.forEach( { $0.isEnabled = validateMenuItem($0) } )
}

必须将必须处理的每个菜单的委托设置为MyWindow对象(在本例中)。在我的示例中,菜单项View的菜单必须将其委托设置为MyWindow

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56849263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档