OS X开发NSMenu应用详解

简介: OS X开发NSMenu应用详解

一、引言


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


二、主应用菜单


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


image.png


三: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;

}

效果如下:


image.png


四、视图右键弹出菜单


   视图右键弹出菜单是基于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];

}

效果如下:

image.png



五、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;

目录
相关文章
|
21天前
|
安全 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统优化策略####
当今数字化时代,移动应用已成为日常生活不可或缺的一部分,而移动操作系统则是支撑这些应用运行的基石。本文旨在探讨当前移动应用开发的最新趋势,分析主流移动操作系统的特点及优化策略,为开发者提供有价值的参考。通过深入剖析技术创新、市场动态与用户需求变化,本文力求揭示移动应用与系统协同发展的内在逻辑,助力行业持续进步。 ####
41 9
|
23天前
|
人工智能 Android开发 数据安全/隐私保护
移动应用与系统:探索开发趋势与操作系统的协同进化####
当今时代,移动应用不再仅仅是简单的软件工具,它们已成为扩展智能手机及平板等设备功能的关键。本文旨在深入分析当前移动应用的开发趋势,探讨移动操作系统的最新进展及其对应用开发的影响,并阐述两者如何相互促进、协同进化,共同推动移动互联网技术向前发展。 ####
|
28天前
|
人工智能 物联网 Android开发
移动应用与系统:探索开发趋势与操作系统的协同进化####
本文深入探讨了移动应用开发的当前趋势,以及这些趋势如何与移动操作系统的发展相互影响、协同进化。通过分析最新的技术动态、市场数据及用户行为变化,本文旨在为开发者提供关于未来移动应用开发方向的洞察,并讨论操作系统层面的创新如何促进或制约应用的发展。 ####
|
1月前
|
安全 物联网 Android开发
移动应用与系统:探索开发趋势与操作系统的演进####
【10月更文挑战第29天】 本文深入探讨了移动应用开发的最新趋势与挑战,并分析了主流移动操作系统(如Android、iOS)的发展动态。通过对比不同系统的技术特点和市场表现,揭示了移动应用生态系统的复杂性及其对开发者的影响。此外,还讨论了跨平台开发工具的兴起如何改变应用开发流程,以及这些变化对未来移动计算领域的潜在影响。 ####
35 4
|
1月前
|
前端开发 测试技术 调度
移动应用与系统:探索开发与操作系统的奥秘####
【10月更文挑战第22天】 本文深入剖析了移动应用的开发流程与移动操作系统的核心原理,揭示了两者如何相互依存、共同推动移动互联网的发展。从应用架构设计到操作系统性能优化,全方位解读移动生态的技术细节,为开发者和用户提供有价值的参考。 ####
34 5
|
1月前
|
搜索推荐 前端开发 测试技术
移动应用与系统:探索开发之道与操作系统的演进#### 一、
【10月更文挑战第24天】 本文将带你深入探索移动应用开发的全过程,从构思到上架的每一个细节。同时,我们还将回顾移动操作系统的发展历程,分析当前主流系统的技术特点和未来趋势。无论你是开发者还是普通用户,都能在这里找到感兴趣的内容。 #### 二、
26 1
|
1月前
|
安全 算法 Unix
深入浅出操作系统:从基础概念到实践应用
【10月更文挑战第22天】本文旨在以浅显易懂的语言,为读者揭开操作系统的神秘面纱。我们将从操作系统的基本概念出发,逐步深入其核心功能与设计哲学,并通过具体代码示例,展示操作系统如何在实际中发挥作用。无论你是计算机科学的学生,还是对技术有浓厚兴趣的爱好者,这篇文章都将为你提供一次轻松愉快的操作系统之旅。
44 4
|
2月前
|
安全 Android开发 数据安全/隐私保护
移动应用与系统:探索开发趋势与操作系统革新#### 一、
【10月更文挑战第20天】 本文旨在剖析当前移动应用开发的热门趋势,并探讨移动操作系统的最新进展与未来展望。通过梳理从原生应用到跨平台开发的转变,以及主流操作系统如iOS和Android的技术创新,本文为开发者提供了一份详尽的行业指南,助力他们在快速迭代的移动科技领域保持领先。 #### 二、
39 2
|
29天前
|
开发工具 Android开发 数据安全/隐私保护
探索移动应用的世界:从开发到操作系统的全面解析
【10月更文挑战第33天】在数字化时代,移动应用已成为我们日常生活中不可或缺的一部分。本文将深入探讨移动应用的开发过程,包括编程语言、开发工具和框架的选择,以及如何构建用户友好的界面。同时,我们还将分析移动操作系统的核心功能和安全性,以帮助读者更好地理解这些应用程序是如何在各种设备上运行的。无论你是开发者还是普通用户,这篇文章都将为你揭示移动应用背后的奥秘。
|
1月前
|
人工智能 前端开发 物联网
移动应用与系统:探索开发与操作系统的协同进化####
【10月更文挑战第26天】 本文探讨了移动应用开发和移动操作系统之间的紧密关系,揭示了它们是如何相互影响和促进彼此发展的。从早期的功能手机到现今的智能手机,移动操作系统经历了巨大的变革,而移动应用作为其生态系统中的重要组成部分,也随着技术的演进不断创新。文章将深入分析这一过程中的关键节点和技术突破,以及未来的发展趋势。 ####
25 0