Cocoa 如何将菜单项添加到NSTextField的上下文菜单

Cocoa 如何将菜单项添加到NSTextField的上下文菜单,cocoa,nstextfield,Cocoa,Nstextfield,我试图覆盖简单的NSView方法: - (NSMenu *)menuForEvent:(NSEvent *)event { NSMenu* result = [super menuForEvent: event]; NSMenuItem* mi = [[NSMenuItem alloc] initWithTitle: @"Foobar" action: @selector(foobar) keyEquivalent: @""]; [result addItem: mi];

我试图覆盖简单的NSView方法:

- (NSMenu *)menuForEvent:(NSEvent *)event {
   NSMenu* result = [super menuForEvent: event];
   NSMenuItem* mi = [[NSMenuItem alloc] initWithTitle: @"Foobar" action: @selector(foobar) keyEquivalent: @""];
   [result addItem: mi];    
   return result;
}

但它不起作用。它从未被调用。

如果文本字段有焦点,我相信您得到的菜单实际上是。可能会问它要菜单。

如果文本字段有焦点,我相信你得到的菜单实际上是。可能会询问它的菜单。

尝试使用NSTextViewDelegate协议

- (NSMenu *)textView:(NSTextView *)view menu:(NSMenu *)menu forEvent:(NSEvent *)event atIndex:(NSUInteger)charIndex

然后,窗口的字段编辑器将要求您的NSTextField提供菜单

尝试使用NSTextViewDelegate协议

- (NSMenu *)textView:(NSTextView *)view menu:(NSMenu *)menu forEvent:(NSEvent *)event atIndex:(NSUInteger)charIndex

然后,窗口的字段编辑器将向您的NSTextField询问菜单

谢谢其他人指路。我无法让窗口的默认字段编辑器使用任何委托方法。最后,我在窗口代理的-windowDidLoad方法中添加了以下内容

NSTextView* defaultFieldEditor = [self.window fieldEditor:YES forObject:nil];
//  defaultEditor.delegate = self; didn't help
NSMenu *mu = defaultEditor.menu;
[mu insertItem:[NSMenuItem separatorItem] atIndex:0];
[mu insertItemWithTitle:@"Insert Line"
                 action:@selector(acnInsertLine:)
          keyEquivalent:@"" atIndex:0];
 [mu insertItemWithTitle:@"Delete Line"
                  action:@selector(acnDeleteLine:)
           keyEquivalent:@"" atIndex:0];
这应该把项目放在开头(所以顺序相反)。您可以使用
附加项:
。两者都会受到菜单内容变化的影响,而你的项目可能在中间某个地方出现。
请注意,字段编辑器是一个NSTextView,即使它覆盖的控件是一个NSTextField。这让我有些困惑。

谢谢其他人为我指路。我无法让窗口的默认字段编辑器使用任何委托方法。最后,我在窗口代理的-windowDidLoad方法中添加了以下内容

NSTextView* defaultFieldEditor = [self.window fieldEditor:YES forObject:nil];
//  defaultEditor.delegate = self; didn't help
NSMenu *mu = defaultEditor.menu;
[mu insertItem:[NSMenuItem separatorItem] atIndex:0];
[mu insertItemWithTitle:@"Insert Line"
                 action:@selector(acnInsertLine:)
          keyEquivalent:@"" atIndex:0];
 [mu insertItemWithTitle:@"Delete Line"
                  action:@selector(acnDeleteLine:)
           keyEquivalent:@"" atIndex:0];
这应该把项目放在开头(所以顺序相反)。您可以使用
附加项:
。两者都会受到菜单内容变化的影响,而你的项目可能在中间某个地方出现。 请注意,字段编辑器是一个NSTextView,即使它覆盖的控件是一个NSTextField。这使我有些困惑