objective-c - 对于Objective-C,nsmenuitem nsmenu 菜单栏不显示问题
问题描述
MAC的菜单栏应该显示我设置的菜单标题和子菜单。
NSMenu *subMenu = [[NSMenu alloc] initWithTitle:YMLocalizedString(@"assistant.menu.title")];
[subMenu addItems:@[preventRevokeItem,
autoAuthItem,
groupMgrMenu,
newWeChatItem,
forwardAndReplyItem,
]];
NSMenuItem *menuItem = [[NSMenuItem alloc] init];
menuItem.target = self;
menuItem.enabled = NO;
[menuItem setTitle:YMLocalizedString(@"assistant.menu.title")];
[menuItem setSubmenu:subMenu];
[[[NSApplication sharedApplication] mainMenu] addItem:menuItem];
解决方案
通过删除 main.m 代码并将其替换为以下代码,可以在 Xcode 中运行此示例。同时删除预先提供的 AppDelegate 文件。
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
}
- (void) menuAction: (id)sender;
- (void) buildMenu;
- (void) buildWindow;
@end
@implementation AppDelegate
- (void) menuAction: (id)sender {
NSBeep();
NSLog(@"%@", sender);
}
- (void) buildMenu {
NSMenu *menubar = [NSMenu new];
NSMenuItem *menuBarItem = [NSMenuItem new];
[menubar addItem:menuBarItem];
[NSApp setMainMenu:menubar];
NSMenu *appMenu = [NSMenu new];
NSMenuItem *quitMenuItem = [[NSMenuItem alloc] initWithTitle:@"Quit"
action:@selector(terminate:) keyEquivalent:@"q"];
[appMenu addItem:quitMenuItem];
[menuBarItem setSubmenu:appMenu];
// **** Asst Menu **** //
NSMenuItem *asstMenuItem = [menubar addItemWithTitle:@"" action:nil keyEquivalent:@""];
NSMenu *asstMenu = [[NSMenu alloc] initWithTitle:@"assistant.menu.title"];
[menubar setSubmenu: asstMenu forItem:asstMenuItem];
NSArray *itemArray = @[@"preventRevokeItem", @"autoAuthItem", @"groupMgrMenu", @"newWeChatItem", @"forwardAndReplyItem"];
[asstMenu addItemWithTitle: itemArray[0] action:@selector(menuAction:) keyEquivalent:@""];
[asstMenu addItemWithTitle: itemArray[1] action:@selector(menuAction:) keyEquivalent:@""];
[asstMenu addItemWithTitle: itemArray[2] action:@selector(menuAction:) keyEquivalent:@""];
[asstMenu addItemWithTitle: itemArray[3] action:@selector(menuAction:) keyEquivalent:@""];
[asstMenu addItemWithTitle: itemArray[4] action:@selector(menuAction:) keyEquivalent:@""];
}
- (void) buildWindow {
#define _wndW 300
#define _wndH 250
window = [[NSWindow alloc] initWithContentRect: NSMakeRect( 0, 0, _wndW, _wndH )
styleMask: NSWindowStyleMaskTitled | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable
backing: NSBackingStoreBuffered defer: NO];
[window center];
[window setTitle: @"Test window"];
[window makeKeyAndOrderFront: nil];
// ***** Quit btn ***** //
NSButton *quitBtn = [[NSButton alloc]initWithFrame:NSMakeRect( _wndW - 50, 5, 40, 40 )];
[quitBtn setBezelStyle:NSBezelStyleCircular ];
[quitBtn setTitle: @"Q" ];
[quitBtn setAutoresizingMask: NSViewMinXMargin];
[quitBtn setAction:@selector(terminate:)];
[[window contentView] addSubview: quitBtn];
}
- (void) applicationWillFinishLaunching: (NSNotification *)notification {
[self buildMenu];
[self buildWindow];
}
- (void) applicationDidFinishLaunching: (NSNotification *)notification {
}
@end
int main () {
NSApplication *application = [NSApplication sharedApplication];
AppDelegate *appDelegate = [[AppDelegate alloc] init];
[application setDelegate:appDelegate];
[application run];
return 0;
}
推荐阅读
- php - 如何使表正确更新数据库中的 otp 代码?
- hyperledger-fabric - 将外部 node.js 包包含到 Hyperledger Fabric 事务处理器函数中的替代方法
- java - 在 Spring 服务中,我应该在方法末尾设置 null 还是空列表以节省内存?
- android - Android:可点击的 TextView 链接/按钮
- javascript - 如何打破while循环和if语句?
- javascript - 我正在 IFRAME 中打开外部网站。如何捕获在 Iframe 中的外部网站中单击的确切链接?
- javascript - 带有 JSON 数据的动态图表 - CanvasJS
- docker - Kubernetes 部署容器后不会启动服务
- php - 加载时执行 PHP 函数时 HTML 不呈现
- c# - 暂停后台工作人员,直到用户确认取消