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

时间:2010-08-24 17:24:30

标签: 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];    
   return result;
}

但它不起作用。永远不会被称为。

3 个答案:

答案 0 :(得分:4)

尝试使用NSTextViewDelegate协议

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

窗口的字段编辑器将询问您的NSTextField菜单

答案 1 :(得分:0)

如果文本字段具有焦点,我相信您获得的菜单实际上是Field Editor的菜单。也许问它它的菜单。

答案 2 :(得分:0)

感谢其他人指明道路。我无法让窗口的默认字段编辑器使用任何委托方法。最后,我将以下内容放在我的窗口委托的-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];

这应该将项目放在开头(所以反向顺序)。您可以使用addItem:代替。两者都存在这样的问题,即菜单内容会有所不同,而且您的项目可能会在中间某处出现。

请注意,即使它所涵盖的控件是NSTextField,字段编辑器也是NSTextView。这让我有些困惑。