macOS 开发 - NSMenu 添加目录


一、添加顶部(mainMenu)目录

1、简单常用的一级目录

- (void)addMenu{
    
    //获取主目录
    NSMenu *mainMenu = [NSApp mainMenu];
    NSLog(@"%@ - %@",mainMenu,[mainMenu itemArray]);
    
    //添加一级目录
    NSMenuItem *oneItem = [[NSMenuItem alloc] init];
    [oneItem setTitle:@"Load_TEXT"];
    [mainMenu addItem:oneItem];
    
    //添加二级目录项
    NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@"Load_TEXT"];
  
    [subMenu addItemWithTitle:@"Load1"action:@selector(load1) keyEquivalent:@"E"];
    [subMenu addItemWithTitle:@"Load2"action:@selector(load2) keyEquivalent:@"R"];
    
    [oneItem setSubmenu:subMenu];
    
     //更新
    [NSApp setMainMenu:mainMenu];
}

2、添加二三级目录

- (void)addMenu{
    
    NSImageView *imgView = [[NSImageView alloc]initWithFrame:NSMakeRect(100, 100, 100, 100)];
    [self.window.contentView addSubview:imgView];
    imgView.image = [NSImage imageNamed:@"apple"];
    
    //1.获取主目录
    NSMenu *mainMenu = [NSApp mainMenu];
    
    NSLog(@"%@ - %@",mainMenu,[mainMenu itemArray]);
    
    //2.添加一级目录
    NSMenuItem *oneItem = [[NSMenuItem alloc] initWithTitle:@"一级目录" action:nil keyEquivalent:@"O"];
    [oneItem setTitle:@"Load_TEXT"]; //设置文字无效
    [mainMenu insertItem:oneItem atIndex:2];
    
    //3.添加二级目录项
    NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@"一级目录"]; //这里设置一级目录的名字有效
    [oneItem setSubmenu:subMenu];
    
    [subMenu addItemWithTitle:@"Load1"action:@selector(load1) keyEquivalent:@"E"];
    [subMenu addItemWithTitle:@"Load2"action:@selector(load2) keyEquivalent:@"T"];
    
    NSMenuItem *item3 = [[NSMenuItem alloc]initWithTitle:@"Load3" action:@selector(load2) keyEquivalent:@"T"];

    [subMenu addItem:item3];
    
    //4、添加三级目录
    NSMenu *subMenu3 = [[NSMenu alloc] initWithTitle:@"三级目录"];
    [item3 setSubmenu:subMenu3];
    
    //5、给三级目录添加子目录
    NSMenuItem *item30 = [[NSMenuItem alloc]initWithTitle:@"-30" action:@selector(load2) keyEquivalent:@"T"];
    NSMenuItem *item31 = [[NSMenuItem alloc]initWithTitle:@"-31" action:@selector(load2) keyEquivalent:@"T"];
    
    [subMenu3 addItem:item30];
    [subMenu3 addItem:item31];
    
     //更新
    [NSApp setMainMenu:mainMenu];
}

效果如图:

三级目录


二、添加 Dock 菜单

1、在 delegate.m 中添加属性:
@property (nonatomic,strong) NSMenu *dockMenu;


2、初始化 menu
2.1 添加简单的一级 menu

- (void)addDockMenu{
    
    self.dockMenu = [[NSMenu alloc] initWithTitle:@"DockMenu"];
    
    [self.dockMenu setAutoenablesItems:NO];
    
    
    NSMenuItem *oneItem = [[NSMenuItem alloc] initWithTitle:@"新的Dock目录" action:@selector(load1) keyEquivalent:@"P"];
    [oneItem setTarget: self];
    [self.dockMenu addItem:oneItem];
  
}

效果如图:

Dock目录


2.2 添加二级目录,三级的话,可以参考上一部分的代码

- (void)addDockMenu{
    
    self.dockMenu = [[NSMenu alloc] initWithTitle:@"DockMenu"];
    
    [self.dockMenu setAutoenablesItems:NO];
    
    
    NSMenuItem *oneItem = [[NSMenuItem alloc] initWithTitle:@"新的Dock目录" action:@selector(load1) keyEquivalent:@"P"];
    [oneItem setTarget: self];
    
    [self.dockMenu addItem:oneItem];
    
    NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@"一级目录"]; //这里设置一级目录的名字有效
    [oneItem setSubmenu:subMenu];
    
    [subMenu addItemWithTitle:@"Load1"action:@selector(load1) keyEquivalent:@"E"];
    
}

3、在系统代理方法中返回该目录

- (NSMenu *)applicationDockMenu:(NSApplication *)sender
{
    return self.dockMenu;
}

三、状态栏(NSStatusItem)添加菜单

  NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@"Load_TEXT"];
    
    [subMenu addItemWithTitle:@"Load1"action:@selector(load1) keyEquivalent:@"E"];
    [subMenu addItemWithTitle:@"Load2"action:@selector(load2) keyEquivalent:@"R"];

    statusItem.menu = subMenu;

NSStatusItem menu


四、给一个NSView添加右击菜单

  • 这里的快捷键可能无法直接使用。邮件点击该 View,再使用快捷键有效。
  • 一个目录可以添加给多个控件。
- (void)addViewMenu{

    NSMenu *newMenu = [[NSMenu alloc] initWithTitle:@"View 的目录"];
    
    NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:@"View 的item" action:@selector(load1) keyEquivalent:@"E"];
    
    [newItem setEnabled:YES];
    [newItem setTarget:self];
    
    [newMenu addItem:newItem];
    
    [self.indicater0 setMenu:newMenu];
    [self.indicater1 setMenu:newMenu];
}

View 的 menu


五、小结

  • 一级目录 和 二级目录 都属于 NSMenu 类。
  • 一级目录和二级目录的内容属于 NSMenuItem 类。
  • 一个一级目录下,只能有一个二级目录,只能用 setSubmenu 设置一级下的二级目录;
  • 二级目录下面可以有多个 item,可以用 addItemWithTitleinsertItemWithTitle 来添加。
  • keyEquivalent 是配置的快捷键,如果配置 E,则 command + shif + E 可以调用这个方法。 E 区分大小写,小写无效。
  • insertItem 的时候,需要注意 index 的位置。

insert


六、参考&推荐阅读:

http://blog.csdn.net/zhjwwdz/article/details/19980131

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI工程仔

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值