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

Posted

技术标签:

【中文标题】如何自定义 PDFView 的上下文菜单?【英文标题】:How do I customise the contextual menu of a PDFView? 【发布时间】:2018-10-01 15:43:21 【问题描述】:

我在我的应用程序中使用 PDFView 实例。我想将我自己的项目添加到上下文菜单中,并删除一些不适合我的应用程序的默认项目。

一些默认项目是合适的,所以理想情况下我会调整现有菜单而不是构建新菜单。

当我创建 pdf 视图时,不存在有效的 pdfView.menu 项,因此我无法设置自己的委托。

我尝试使用从 PDFView 继承的类(声明为 NSMenuDelegate)并覆盖 menuWillOpen 和 menuNeedsUpdate - 但我的代码从未被调用。

我可以看到 PDFView 在呈现的上下文菜单中混合了文本字段和 pdf 相关菜单项,具体取决于文本选择,因此显然那里没有固定菜单。

无论如何我可以拦截它还是我只需要强制我自己的菜单?

在 MacOS 10.13 上。

【问题讨论】:

关于菜单的部分取决于选择可能是关于autoenabling 功能,但是有效。 谢谢@F***。我不想禁用项目,我想完全删除它们(或至少隐藏)。我能够使用 Willke 的解决方案而无需进行任何验证 - 即我保持自动启用。 【参考方案1】:

子类PDFView 并覆盖func menu(for event: NSEvent) -> NSMenu?。致电super 并调整菜单。

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

【讨论】:

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

以上是关于如何自定义 PDFView 的上下文菜单?的主要内容,如果未能解决你的问题,请参考以下文章

Ionic 4 - 自定义上下文菜单

如何像默认上下文菜单一样为 ScrollBar 的自定义上下文菜单获取默认本地化?

如何在 Delphi Form Designer 中为自定义组件添加上下文菜单操作?

如何自定义“关于应用程序”菜单项

通过上下文菜单删除后刷新自定义列表视图

为啥这个自定义 nemo 操作没有出现在上下文菜单中?