首页 > 解决方案 > 对于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];

标签: objective-cmacos

解决方案


通过删除 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;
}


推荐阅读