如何自定义PDFView的上下文菜单?

4
我在我的应用程序中使用了一个PDFView实例。我想要添加自己的菜单项并删除一些不适合我的应用程序的默认项。有些默认项是适合的,因此最好是修改现有菜单而不是构建新菜单。但是,当我创建pdf视图时,不存在有效的pdfView.menu项,因此我无法设置自己的委托。我试图使用继承自PDFView的类(声明为NSMenuDelegate)并覆盖menuWillOpen和menuNeedsUpdate方法,但我的代码从未被调用。我可以看到PDFView会根据文本选择混合textfield和pdf相关的菜单项,在呈现的上下文菜单中,因此显然没有固定的菜单。是否有任何方法可以拦截这个菜单或者我只能强行在它上面使用自己的菜单?运行环境为MacOS 10.13。

关于菜单依赖于选择的部分可能涉及到“自动启用”功能,不过具体如何实现还需进一步了解。 - Fabian
谢谢@Fabian。我不想禁用项目,我想要完全删除它们(或者至少隐藏它们)。我能够使用Willke的解决方案而不必进行任何验证 - 也就是说,我保留了自动启用功能。 - Giles
1个回答

7

继承PDFView类并重写func menu(for event: NSEvent) -> NSMenu?函数。调用super并适应菜单。

采用NSMenuItemValidation协议并实现func validateMenuItem(_ menuItem: NSMenuItem) -> Bool以启用和禁用项目。


非常感谢@Willeke - 这就解决了。我隐藏了所有我不想要的项目,并通过它们的.action.description(给出方法名)来识别它们,这比标题更稳定(特别是在本地化等方面)。 - Giles
对于普通菜单,当您子类化PDFView时,可能需要在类声明中添加, NSMenuItemValidation。否则,即使您实现了validateMenuItem(...),它也不会被调用。 - jsbox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接