gpt4 book ai didi

macos - 上下文菜单未调用 NSMenuDelegate 方法

转载 作者:行者123 更新时间:2023-12-03 16:37:12 27 4
gpt4 key购买 nike

我有一个基于文档的应用程序。我想添加一个上下文菜单,当用户右键单击 NSTextView 中的选定文本时,该菜单显示上下文相关信息。

我已遵循 Apple documentation 中的建议和

  • 在我的 XIB 文件中添加了一个 NSMenu 作为根对象。
  • 将 NSMenu 实例连接到 NSTextView 的 menu 导出。
  • 将 IBAction 连接到 NSMenu 内的 NSMenuItem。

到目前为止一切顺利。一切都按预期进行:菜单项出现,并且在选择它时调用操作。

我需要在菜单出现之前从 NSTextView 获取选定的文本,以便我可以适本地配置我的菜单项。根据文档

If you need to customize the contextual menu, you can do so by setting an appropriate object as the menu’s delegate and implementing the menuWillOpen: method to customize the menu as you see fit just before it appears.

我将 NSMenu 的委托(delegate)连接到文件的所有者。没有调用任何委托(delegate)方法。 ( menuWillOpen: 是我唯一需要的,但我也尝试过其他的)。

我在 IBAction 内设置了一个断点,当选择菜单项时会调用该断点。如果我使用调试器检查菜单,我可以看到委托(delegate)已正确设置为实现委托(delegate)方法的对象。

还有什么要检查的吗?我做错了什么吗?

Xcode v4.6.3
SDK v10.8
部署目标10.7

最佳答案

经过一番挖掘,这就是我发现的: NSTextView 构建了一个不同的 NSMenu 实例来用作上下文菜单,可能是通过覆盖 -menuForEvent: 或一些类似的内部方法。这个新菜单从您在 Interface Builder 中创建的菜单复制菜单项(事实上,它创建新的菜单项实例,其属性是从原始菜单项复制的),但它不复制菜单委托(delegate),这就是为什么您的菜单委托(delegate)未收到 -menuWillOpen:。我不确定这是有意还是无意。阅读您发布的文档引用,这似乎是一个错误。

您可以做的是将 NSTextView 实例的委托(delegate)设置为一个类符合 NSTextViewDelegate 的对象(可能是您的文件所有者,它已经符合 >NSMenuDelegate)并实现以下方法:

- (NSMenu *)textView:(NSTextView *)view menu:(NSMenu *)menu forEvent:(NSEvent *)event atIndex:(NSUInteger)charIndex
{
// if the menu delegate is not self, set another object
[menu setDelegate:self];

return menu;
}

这将确保 TextView 创建的上下文菜单使用您的委托(delegate)。

注意:由于 NSTextView 创建了不同的上下文菜单,因此它可能可能希望将菜单委托(delegate)设置为自身或其他内部对象。在我的测试中,委托(delegate)是nil,所以看起来很安全。或者,您可以放弃建议的 menu 参数并返回您自己的 NSMenu 实例,并正确设置委托(delegate)。

关于macos - 上下文菜单未调用 NSMenuDelegate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com