Cocoa 如何将菜单项添加到NSTextField的上下文菜单
我试图覆盖简单的NSView方法: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];
- (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。这使我有些困惑