Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 未为上下文菜单调用NSMenuDelegate方法_Macos_Cocoa_Nsmenu - Fatal编程技术网

Macos 未为上下文菜单调用NSMenuDelegate方法

Macos 未为上下文菜单调用NSMenuDelegate方法,macos,cocoa,nsmenu,Macos,Cocoa,Nsmenu,我有一个基于文档的应用程序。我想添加一个上下文菜单,当用户右键单击NSTextView中的选定文本时,该菜单将显示上下文相关信息 我已采纳了和中的建议 在我的XIB文件中添加了一个NSMenu作为根对象 将NSMenu实例连接到NSTextView的菜单出口 已将iAction连接到NSMenuItem中的NSMenuItem 到目前为止还不错。每件事都按预期工作:菜单项出现,并且在选中时调用操作 在菜单出现之前,我需要从NSTextView中获取所选文本,以便可以适当配置菜单项。根据文件

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

我已采纳了和中的建议

  • 在我的XIB文件中添加了一个NSMenu作为根对象
  • 将NSMenu实例连接到NSTextView的
    菜单
    出口
  • 已将iAction连接到NSMenuItem中的NSMenuItem
到目前为止还不错。每件事都按预期工作:菜单项出现,并且在选中时调用操作

在菜单出现之前,我需要从NSTextView中获取所选文本,以便可以适当配置菜单项。根据文件

如果需要自定义上下文菜单,可以通过设置 一个合适的对象作为菜单的委托并实现 menuWillOpen:根据您之前认为合适的方式自定义菜单的方法 看来

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

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

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

Xcode v4.6.3
SDK v10.8

部署目标10.7

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

您可以做的是将
NSTextView
实例的委托设置为一个对象,该对象的类符合
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;
}
这将确保文本视图创建的上下文菜单使用您的委托


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

找到此线程为我节省了很多时间…谢谢!下面是一个在Swift中的
NSView
中工作的实现
myNSMenu
是从故事板到
appDelegate
的一个出口,也是
NSMenu
的一个子类。如果未在下面的代码中指定委托,则不会调用
NSMenuDelegate
函数

    let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.myNSMenu.delegate = appDelegate.myNSMenu
    NSMenu.popUpContextMenu(appDelegate.myNSMenu, withEvent: theEvent, forView: self)        

好极了!按照您的建议设置代理似乎有效,但我甚至不必这样做。您指出的NSTextViewDelegate调用允许我访问文本视图和菜单,这是我根据需要自定义菜单所需的一切。非常感谢。