我试图覆盖简单的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;
}
但它不起作用。永远不会被称为。
答案 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。这让我有些困惑。