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;

目录
相关文章
|
人工智能 搜索推荐 API
🚀 2小时极速开发!基于DeepSeek+智体OS的AI社交「头榜」震撼上线!
基于DeepSeek大模型与DTNS协议的革命性AI社交平台「头榜」震撼上线!仅需2小时极速开发,即可构建完整社交功能模块。平台具备智能社交网络、AI Agent生态、Prompt市场、AIGC创作等六大核心优势,支持低代码部署与个性化定制。开发者可快速接入DeepSeek API,体验去中心化架构与数据自主权。官网:[dtns.top](https://dtns.top),立即开启你的AI社交帝国!#AI社交 #DeepSeek #DTNS协议
525 4
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS三
本文介绍了ArkTS的基础语法,包括常量、命名规则、数组及其常用函数,以及函数的定义与使用,涵盖匿名函数和箭头函数的区别。通过具体示例,帮助读者快速掌握ArkTS编程技巧,踏上Harmony OS开发之旅。君志所向,一往无前!
976 1
Harmony OS开发-ArkTS三
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
866 47
Harmony OS开发-ArkTS语言速成二
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
1190 11
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
前端开发 JavaScript 开发工具
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
1206 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
958 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
JavaScript 编译器 开发工具
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
980 2
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
人工智能 安全 Anolis
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
525 19
|
开发框架 JavaScript 前端开发
Harmony OS开发-ArkT语言速成一
本文介绍ArkTS语言,它是鸿蒙生态的应用开发语言,基于TypeScript,具有静态类型检查、声明式UI、组件化架构、响应式编程等特性,支持跨平台开发和高效性能优化。ArkTS通过强化静态检查和分析,提升代码健壮性和运行性能,适用于Web、移动端和桌面端应用开发。关注我,带你轻松掌握HarmonyOS开发。
898 5
Harmony OS开发-ArkT语言速成一

推荐镜像

更多