【发布时间】:2019-07-02 09:25:16
【问题描述】:
我的主菜单有几个菜单项(文件、编辑、视图、窗口等)。所有菜单项的操作都设置为FirstResponder 中的操作。
应用程序有一个窗口,该窗口的类型为MyWindow,继承自NSWindow(见下文)。
请注意,NSWindow 实现了NSMenuValidation,因此当MyWindow 声明符合NSMenuValidation 时,它被标记为错误。
我已经重写了函数validateMenuItem如下:
class MyWindow: NSWindow, NSMenuDelegate {
...
override func validateMenuItem(_ item: NSMenuItem) -> Bool {
Log.atDebug?.log("\(item.title)")
....
}
}
当我运行应用程序时,File 和 Window 菜单项调用了 validateMenuItem 函数,但Edit 和 View 项没有调用。
注意:Log 是日志框架 (SwifterLog) 的一个实例。
正确调用所有菜单项的操作。 (也适用于未调用validateMenuItem 的菜单项)
解决这个问题对我来说并不难(函数menuNeedsUpdate 被所有菜单调用并且可以用于此),但我想知道为什么会出现这种行为。
【问题讨论】:
-
是文本字段、文本视图或其他对象验证编辑菜单项吗?
-
我很震惊它完全有效。顶级子菜单项的验证/启用可能与 AppKit 内部工作中的某些巫术有关,并且这些顶级菜单项的正常验证正在短路。
-
@Willeke,它与 MyWindow 对象绑定,如使用 Firstresponder 的代码所示
-
@JamesBucanek:这在早期版本的 macOS 中运行良好(实际上是 OSX)
-
如果您认为这是顶级菜单项的已记录功能不再正常工作,我建议您提交错误报告。但我的感觉是,这是私有框架代码的副作用,因此是一个移动的目标。错误报告反馈应该让您了解 Apple 对此事的看法——这比我的要重要得多。 ;)