【问题标题】:How to create logical groups inside a context menu. Mac OS如何在上下文菜单中创建逻辑组。苹果系统
【发布时间】:2017-03-01 16:44:38
【问题描述】:

我想通过分离子菜单中的菜单项来创建逻辑组。

类似于在 Mac 中打开子菜单。

我怎样才能做到这一点。

NSMenuItem 分隔项创建一个空白区域,我要求视觉效果与附加图像中的相同。

【问题讨论】:

  • 这些行是分隔项。如何创建菜单?
  • NSMenu* mainMenu = [[NSMenu alloc]init];NSMenuItem *mainItem = [[NSMenuItem alloc]init];[mainItem setTitle:NSLocalizedString(@"My Menu", nil)];[mainItem setImage:[NSApp applicationIconImage]];[mainMenu addItem:[self createOpenInWebMenuItem]];[mainItem setSubmenu:mainMenu];NSMenu *mainMenu = [[NSMenu alloc] initWithTitle:@""];[mainMenu addItem:mainItem];return mainMenu;
  • NSMenuItem *openInWebMenu = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"OPEN_IN_WEB", nil) action:@selector(handleMenuItemSelection:) keyEquivalent:@""];openInWebMenu.tag = MenuItemOpenInWeb;[openInWebMenu setObservationInfo:(__bridge void * _Nullable)([Util getSingleSelectedItemFilePath])];return openInWebMenu;
  • 可以确认在 App 菜单中产生分隔符的相同代码在上下文(右键单击)Finder 菜单(Finder 同步扩展)中显示为空格。

标签: objective-c macos finder-extension


【解决方案1】:

我猜是,您正在搜索子菜单项。通过搜索子菜单在 Interface Builder 中找到它。

在所需的菜单中插入后,您会发现一个名为 Item 的新条目。只需编辑这些和/或根据需要填写其他菜单项。这会根据您的要求创建一个菜单结构!

  • 编辑 *

我为您的问题提供了解决方案。根据 Apple Docs 上下文菜单位于它们所属的视图中。从 viewController `viewDidLoad 调用方法。选择器方法根据需要创建。

* 编辑 * 将创建的菜单分配给主菜单。我在viewDidLoad 方法中做到了这一点。如果您不喜欢将它放在顶部的主菜单上,只需跳过 mainmenu 注释后的两行即可。顺便说一句,索引是菜单在主菜单中插入的位置。

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self view] setMenu:[self contextMenu]];

    NSMenuItem *subMenu = [[NSMenuItem alloc] init];
    subMenu.submenu = [self contextMenu];

    // Add the menu in mainmenu as well
    NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
    [mainMenu insertItem:subMenu atIndex:3];
   }

-(NSMenu *)contextMenu {

    NSMenu *contextMenu = [[NSMenu alloc] initWithTitle:@"Contextmenu"];

    NSMenuItem *subMenuItem = [[NSMenuItem alloc] init];
    [subMenuItem setEnabled:YES];
    [subMenuItem setTarget:self];
    [subMenuItem setEnabled:YES];

    NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@"Submenu"];
    subMenuItem.submenu = subMenu;
    [subMenuItem setTitle:[subMenu title]];

   // Creates the menu entries.
    NSMenuItem *menuItem1 = [[NSMenuItem alloc] initWithTitle:@"otherMenu" action:@selector(subMenuAction:) keyEquivalent:@""];
    NSMenuItem *menuItem2 = [[NSMenuItem alloc] initWithTitle:@"anotherMenu" action:@selector(subMenuAction:) keyEquivalent:@""];

 // Creates the separator.
   NSMenuItem *separator = [NSMenuItem separatorItem];

  [subMenu addItem:menuItem1];
  [subMenu addItem:separator];
  [subMenu addItem:menuItem2];


  [contextMenu addItem:subMenuItem];

  return contextMenu;

 }

- (void)subMenuAction:(id)sender {

}

我测试了它并且它有效!这里是截图。

希望对您有所帮助。当它出现时,使用绿色回答菜单:-)

【讨论】:

  • 我们可以使用objective-c 以编程方式做到这一点吗?我正在创建一个 Cusotm 上下文菜单作为 Finder 扩展,因此没有相同的界面构建器。另外,我的动机是在菜单项之间创建一个薄的水平分隔符,就像您在第二个菜单中的打开和关闭之间的第二个屏幕截图中看到的那样。感谢您的支持。干杯!
  • 这里有一个完整的解决方案。
  • 我曾尝试使用 NS 分隔项,但这不会创建水平线,而是创建一个空白空间。我也尝试了您的代码,但结果相同。参考图片:[drive.google.com/drive/folders/…
  • 嗨@voltae,我仍然无法找到解决方案。我创建了一个新项目并使用了您的代码,但仍然看到一个空白条目。
  • 注意:我忘了提,这适用于主应用程序(主应用程序的上下文菜单),但会在查找器同步扩展中创建一个空白条目。
猜你喜欢
  • 2014-07-27
  • 2011-01-12
  • 2022-01-03
  • 2020-09-28
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多