objective-c - 右键单击 NSWindow 选项卡,将其他菜单项添加到上下文菜单

标签 objective-c swift macos cocoa appkit

目前 macOS 支持窗口标签,我们可以将多个窗口合并为单个窗口上的标签。现在,如果我们右键单击选项卡,它会在上下文菜单中显示默认菜单项,例如“关闭选项卡”、“关闭其他选项卡”、“将选项卡移动到新窗口”。然而,Safari 选项卡有一个额外的菜单项作为“Pin Tab”,而 Xcode 选项卡有一个额外的菜单项作为“New Tab”。

enter image description here enter image description here

我想在我的 mac 应用程序中实现类似的功能。如何在我的应用程序中向此上下文菜单添加其他菜单项。我查看了 NSWindowNSWindowControllerNSDocument 的文档,但都没有提及此上下文菜单。如果实现过类似方法的人可以分享一些关于如何解决这个问题的想法,那将非常有帮助。

最佳答案

您可以观察到 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/

相关文章:

macos - Mac 终端中的 mkdir/cp 给出 "Permission denied"错误

ios - 为标识符(单元格)注册的无效 Nib

ios - 你能使用 Swift ARC 快速释放稀缺资源(文件描述符、网络套接字)吗?

ios - 如何在 UIImagePickerController 捕获图像的瞬间获取当前位置?

swift - 在 Swift 中,我可以编写一个通用函数来调整数组的大小吗?

linux - Django 服务器从 Mac 到 Linux 的本地端口转发

ios - 用 Swift 模拟

ios - 从Estimote iBeacon的UUID获得专业和副修

ios - __NSCFString timeIntervalSinceReferenceDate] : unrecognized selector sent to instance

Xcode 5 链接到同一项目中的框架时出现问题