目前 macOS 支持窗口标签,我们可以将多个窗口合并为单个窗口上的标签。现在,如果我们右键单击选项卡,它会在上下文菜单中显示默认菜单项,例如“关闭选项卡”、“关闭其他选项卡”、“将选项卡移动到新窗口”。然而,Safari 选项卡有一个额外的菜单项作为“Pin Tab”,而 Xcode 选项卡有一个额外的菜单项作为“New Tab”。
我想在我的 mac 应用程序中实现类似的功能。如何在我的应用程序中向此上下文菜单添加其他菜单项。我查看了 NSWindow
、NSWindowController
和 NSDocument
的文档,但都没有提及此上下文菜单。如果实现过类似方法的人可以分享一些关于如何解决这个问题的想法,那将非常有帮助。
最佳答案
您可以观察到 NSMenuDidBeginTrackingNotification
通知。它会在菜单出现之前触发。您可以直接将项目添加到菜单,或分配一个委托(delegate)并在 menuNeedsUpdate:
方法中添加它们。请注意不要多次添加您的项目,因为通知会在每次打开菜单之前触发。
菜单项的目标自动设置为选项卡所代表的窗口。这是一个完整的例子:
@implementation TabbedWindow
BOOL didAddMenuItem;
- (void)awakeFromNib
{
[self toggleTabBar:self];
self.title = [[NSUUID UUID] UUIDString];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidStartTracking:) name:@"NSMenuDidBeginTrackingNotification" object:nil];
}
- (IBAction)newWindowForTab:(id)sender
{
TabbedWindowController* twc = [[TabbedWindowController alloc] initWithWindowNibName:@"TabbedWindowController"];
[self addTabbedWindow:twc.window ordered:NSWindowAbove];
[twc.window makeKeyAndOrderFront:nil];
}
- (void)menuDidStartTracking:(NSNotification*)sender
{
if(didAddMenuItem)
return;
NSMenu *tabMenu = (NSMenu *)sender.object;
NSMenuItem *myMenuItem = [[NSMenuItem alloc] initWithTitle:@"My cool item" action:@selector(myCoolAction:) keyEquivalent:@""];
NSMenuItem *anotherItem = [tabMenu itemAtIndex:0];
myMenuItem.target = anotherItem.target;
[tabMenu addItem:myMenuItem];
didAddMenuItem = YES;
}
- (void)myCoolAction:(id)sender
{
NSLog(@"You clicked on the tab for: %@", self.title);
}
请注意,我在自定义 NSWindow
子类中尝试了此代码。您可能还想检查哪个 NSMenu
正在发送通知 - 根据您的应用,它可能是不同的上下文菜单、主菜单等。
关于objective-c - 右键单击 NSWindow 选项卡,将其他菜单项添加到上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44865262/