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];
}
效果如图:
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;
四、给一个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];
}
五、小结
- 一级目录 和 二级目录 都属于
NSMenu
类。 - 一级目录和二级目录的内容属于
NSMenuItem
类。 - 一个一级目录下,只能有一个二级目录,只能用 setSubmenu 设置一级下的二级目录;
- 二级目录下面可以有多个 item,可以用
addItemWithTitle
和insertItemWithTitle
来添加。 - keyEquivalent 是配置的快捷键,如果配置 E,则 command + shif + E 可以调用这个方法。 E 区分大小写,小写无效。
- insertItem 的时候,需要注意 index 的位置。