文档章节

OS X开发NSMenu应用详解

珲少
 珲少
发布于 2017/07/14 16:04
字数 1187
阅读 919
收藏 0

OS X开发NSMenu应用详解

一、引言

    NSMenu在Mac桌面软件开发中往往有3个方面的应用,作为程序的主菜单栏使用,作为视图邮件菜单使用和作为Dock菜单使用。

二、主应用菜单

    使用Xcode新建OX S应用时,可以选择使用Storyboard。Storyboard里面会自动创建一个菜单栏,你可以自行在菜单中进行增删改操作,菜单中的Item触发方法也可以直接与AppDelegate进行关联,实现自定义的菜单逻辑,如图:

三:Dock菜单

    当一款Mac桌面软件运行时,会在Dock栏上显示一个图标,当在此图标上点击右键时,会出现一个Dock菜单,自定义此Dock菜单也十分容易,直接在AppDelegate中重写如下方法即可:

-(NSMenu *)applicationDockMenu:(NSApplication *)sender{
    NSMenu * menu = [[NSMenu alloc]initWithTitle:@"Menu"];
    NSMenuItem * item1 = [[NSMenuItem alloc]initWithTitle:@"菜单1" action:@selector(click) keyEquivalent:@""];
    item1.target = self;
    NSMenuItem * item2 = [[NSMenuItem alloc]initWithTitle:@"菜单2" action:@selector(click) keyEquivalent:@""];
    item2.target = self;
    NSMenuItem * item3 = [[NSMenuItem alloc]initWithTitle:@"菜单3" action:@selector(click) keyEquivalent:@""];
    NSMenu * subMenu = [[NSMenu alloc]initWithTitle:@"subMenu"];
    NSMenuItem * item4 = [[NSMenuItem alloc]initWithTitle:@"菜单4" action:@selector(click) keyEquivalent:@""];
    item4.target = self;
    [subMenu addItem:item4];
    [menu addItem:item1];
    [menu addItem:item2];
    [menu addItem:item3];
    [menu setSubmenu:subMenu forItem:item3];
    return menu;
}

效果如下:

四、视图右键弹出菜单

    视图右键弹出菜单是基于NSView视图的,例如:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSMenu * menu = [[NSMenu alloc]initWithTitle:@"Menu"];
    NSMenuItem * item1 = [[NSMenuItem alloc]initWithTitle:@"菜单1" action:@selector(click) keyEquivalent:@""];
    item1.target = self;
    NSMenuItem * item2 = [[NSMenuItem alloc]initWithTitle:@"菜单2" action:@selector(click) keyEquivalent:@""];
    item2.target = self;
    NSMenuItem * item3 = [[NSMenuItem alloc]initWithTitle:@"菜单3" action:@selector(click) keyEquivalent:@""];
    NSMenu * subMenu = [[NSMenu alloc]initWithTitle:@"subMenu"];
    NSMenuItem * item4 = [[NSMenuItem alloc]initWithTitle:@"菜单4" action:@selector(click) keyEquivalent:@""];
    item4.target = self;
    [subMenu addItem:item4];
    [menu addItem:item1];
    [menu addItem:item2];
    [menu addItem:item3];
    [menu setSubmenu:subMenu forItem:item3];
    [self.view setMenu:menu];
}

效果如下:

五、NSMenuItem详解

    NSMenuItem是菜单中的每一个菜单选项对象,其中常用属性方法如下:

//设置是否启用用户快捷键
+ (void)setUsesUserKeyEquivalents:(BOOL)flag;
//设置用户快捷键启用状态
+ (BOOL)usesUserKeyEquivalents;
//创建一个分割线
+ (NSMenuItem *)separatorItem;
//使用标题,快捷键和方法选择器来对Item进行初始化
- (instancetype)initWithTitle:(NSString *)string action:(nullable SEL)selector keyEquivalent:(NSString *)charCode;
//其所在的菜单对象
@property (nullable, assign) NSMenu *menu;
//其是否有子菜单
@property (readonly) BOOL hasSubmenu;
//子菜单对象
@property (nullable, strong) NSMenu *submenu;
//如果此Item是某个子菜单中的,此属性获取与子菜单关联的父item
@property (nullable, readonly, assign) NSMenuItem *parentItem;
//Item标题
@property (copy) NSString *title;
//富文本标题
@property (nullable, copy) NSAttributedString *attributedTitle;
//是否是分隔线Item
@property (getter=isSeparatorItem, readonly) BOOL separatorItem;
//绑定的快捷键
@property (copy) NSString *keyEquivalent;
//快捷键类型
/*
typedef NS_OPTIONS(NSUInteger, NSEventModifierFlags) {
    NSEventModifierFlagCapsLock           = 1 << 16, // Caps lock键
    NSEventModifierFlagShift              = 1 << 17, // shift键
    NSEventModifierFlagControl            = 1 << 18, // control键
    NSEventModifierFlagOption             = 1 << 19, // option键
    NSEventModifierFlagCommand            = 1 << 20, // command键
    NSEventModifierFlagNumericPad         = 1 << 21, // 小键盘任意键
    NSEventModifierFlagHelp               = 1 << 22, // 帮助键
    NSEventModifierFlagFunction           = 1 << 23, // 任意功能按钮
};
*/
@property NSEventModifierFlags keyEquivalentModifierMask;
//Item图标
@property (nullable, strong) NSImage *image;
//Item状态
@property NSInteger state;
//开启状态下的图标
@property (null_resettable, strong) NSImage *onStateImage;
//关闭状态下的图标
@property (nullable, strong) NSImage *offStateImage;
//混合状态下的图标
@property (null_resettable, strong) NSImage *mixedStateImage;
//是否有效
@property (getter=isEnabled) BOOL enabled;
//是否前置
@property (getter=isAlternate) BOOL alternate;
//Item缩进级别
@property NSInteger indentationLevel;
//设置交互响应者
@property (nullable, weak) id target;
//设置交互相应方法
@property (nullable) SEL action;
//设置tag值
@property NSInteger tag;
//是否高亮
@property (getter=isHighlighted, readonly) BOOL highlighted;
//设置是否隐藏
@property (getter=isHidden) BOOL hidden;
//设置提示文本
@property (nullable, copy) NSString *toolTip;

六、NSMenu详解

//初始化方法
- (instancetype)initWithTitle:(NSString *)title;
//标题
@property (copy) NSString *title;
//在所在的交互点弹出菜单
+ (void)popUpContextMenu:(NSMenu*)menu withEvent:(NSEvent*)event forView:(NSView*)view;
+ (void)popUpContextMenu:(NSMenu*)menu withEvent:(NSEvent*)event forView:(NSView*)view withFont:(nullable NSFont*)font;
- (BOOL)popUpMenuPositioningItem:(nullable NSMenuItem *)item atLocation:(NSPoint)location inView:(nullable NSView *)view NS_AVAILABLE_MAC(10_6);
//设置菜单栏是否可见
+ (void)setMenuBarVisible:(BOOL)visible;
+ (BOOL)menuBarVisible;
//父菜单
@property (nullable, assign) NSMenu *supermenu;
//插入Item
- (void)insertItem:(NSMenuItem *)newItem atIndex:(NSInteger)index;
- (NSMenuItem *)insertItemWithTitle:(NSString *)string action:(nullable SEL)selector keyEquivalent:(NSString *)charCode atIndex:(NSInteger)index;
//添加Item
- (void)addItem:(NSMenuItem *)newItem;
- (NSMenuItem *)addItemWithTitle:(NSString *)string action:(nullable SEL)selector keyEquivalent:(NSString *)charCode;
//删除某个位置的Item
- (void)removeItemAtIndex:(NSInteger)index;
//删除Item
- (void)removeItem:(NSMenuItem *)item;
//为某个Item设置子菜单
- (void)setSubmenu:(nullable NSMenu *)menu forItem:(NSMenuItem *)item;
//删除所有Item
- (void)removeAllItems;
//Item数组
@property (readonly, copy) NSArray<NSMenuItem *> *itemArray;
//获取Item个数
@property (readonly) NSInteger numberOfItems;
//获取某个位置的Item
- (nullable NSMenuItem *)itemAtIndex:(NSInteger)index;
//获取某个Item的位置
- (NSInteger)indexOfItem:(NSMenuItem *)item;
- (NSInteger)indexOfItemWithTitle:(NSString *)title;
- (NSInteger)indexOfItemWithTag:(NSInteger)tag;
- (NSInteger)indexOfItemWithSubmenu:(nullable NSMenu *)submenu;
- (NSInteger)indexOfItemWithTarget:(nullable id)target andAction:(nullable SEL)actionSelector;
//根据标题获取item
- (nullable NSMenuItem *)itemWithTitle:(NSString *)title;
//根据tag获取Item
- (nullable NSMenuItem *)itemWithTag:(NSInteger)tag;
//刷新菜单
- (void)update;
//获取菜单高度
@property (readonly) CGFloat menuBarHeight;
//取消菜单
- (void)cancelTracking;
- (void)cancelTrackingWithoutAnimation;
//获取高亮的Item
@property (nullable, readonly, strong) NSMenuItem *highlightedItem;
//最小宽度
@property CGFloat minimumWidth;
//尺寸
@property (readonly) NSSize size;
//字体
@property (null_resettable, strong) NSFont *font;

 

© 著作权归作者所有

珲少

珲少

粉丝 884
博文 394
码字总数 475753
作品 0
上海
程序员
私信 提问
AppKit 类集合--DejalAppKitCategories

DejalAppKitCategories 是 OS X 上 AppKit 类集合,添加了一些有用的方法到类中:NSMenu, NSTableView,NSTextView 等等: NSButton+Dejal NSImage+Dejal NSMenu+Dejal NSOutlineView+Dejal ......

叶秀兰
2015/02/06
340
0
【书坊赠书福利——第二期】《iOS 8开发指南》

本周是人邮IT书坊赠书的第二期,第一期参与度极高,微信君在此感谢你们的支持,第一期获奖赠书已全部寄出。 本周赠品 本周,微信君给大家推荐@人民邮电出版社-信息技术分社 刚刚上架的新书《...

生气的散人
2014/09/23
380
0
Mac OS X上的lipo命令详解

lipo –create Release-iphoneos/libiphone.a Debig-iphonesimulator/libiphone.a –output libiphone.a lipo -info xxx.a 查看.a文件的支持硬件平台 看到这样的命令行,你会怎样理解呢。 很...

理性编程
2016/06/06
302
0
iOS OS X 和 iOS 中的多线程技术-1

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念 多线程的目的是,通过并发执行提高 CPU 的使用效率,进而提供程序运行效率。 OS X 和 iOS 是多线程操作系统,它们追随 UNIX 系统使用...

石虎132
2017/11/21
0
0
openstack-wsgi的route中增加api流程详解(os-networks)增加

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息。 Better Me的博客:blog.csdn.net/tantexian 如需交流,欢迎大...

tantexian
2016/02/29
227
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
42分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
119
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部