Cocoa应用程序菜单栏无法点击

时间:2015-10-26 12:23:00

标签: objective-c macos cocoa menubar nsapplication

我在我的cocoa应用程序中使用以下代码在我的自定义应用程序@implementation CustomApplication中构建菜单栏:

+(void) setUpMenuBar
{
  [CustomApplication sharedApplication];

  // Main menu
  NSMenu* mainMenu = [NSApp mainMenu];
  if (mainMenu != nil) return; // We set it already
  mainMenu = [[[NSMenu alloc] initWithTitle:@""] autorelease];
  [NSApp setMainMenu:mainMenu];

  // Application menu
  NSMenuItem* appleItem = [mainMenu addItemWithTitle:@""
                                              action:nil
                                       keyEquivalent:@""];

  NSString* appName = @"MyApp";

  NSMenu* appleMenu = [[NSMenu alloc] initWithTitle:@""];

  // Apple menu
  [appleMenu addItemWithTitle:[@"About " stringByAppendingString:appName]
                       action:@selector(orderFrontStandardAboutPanel:)
                keyEquivalent:@""];

  // Quit
  [appleMenu addItemWithTitle:[@"Quit " stringByAppendingString:appName]
                                        action:@selector(terminate:)
                                        keyEquivalent:@"q"];

  [appleItem setSubmenu:[appleMenu autorelease]];
}

启动时,我的应用程序获得焦点,但菜单栏不可克服。 但是,如果我再次单击窗口并将其重新放回(将焦点返回给应用程序),它将变为可单击并正常工作。

我错过了什么吗?

更新

当我按如下方式创建应用程序时调用此方法。 [更新] 这就是我正在使用的应用程序。它实际上是从类的任何@implementation之外的ocaml绑定中调用的第一个东西。

CustomApplicationDelegate* delegate = [CustomApplicationDelegate new];

[CustomApplication sharedApplication];
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
[NSApp activateIgnoringOtherApps:YES];

[[NSApplication sharedApplication] setDelegate:delegate];

[CustomApplication setUpMenuBar];

[[CustomApplication sharedApplication] finishLaunching];

3 个答案:

答案 0 :(得分:5)

好的,感谢@bhaller的评论我能够解决我的问题。

我实际上将调用转移给了代理人,如下所示。

-(void)applicationWillFinishLaunching:(NSNotification *)aNotification
{
  [CustomApplication sharedApplication];
  [CustomApplication setUpMenuBar];
  [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
}

-(void)applicationDidFinishLaunching:(NSNotification *)notification
{
  [CustomApplication sharedApplication];

  [NSApp activateIgnoringOtherApps:YES];
}

答案 1 :(得分:3)

我遇到了这个问题,原因是我对[NSApp activateIgnoringOtherApps:YES]的电话是applicationWillFinishLaunching:而不是applicationDidFinishLaunching:

一旦我移动它,菜单栏就会首次启动。

答案 2 :(得分:1)

如果该应用具有窗口和菜单栏,则通过在Info.plist中删除LSUIElement进行了修复。

旧的解决方案是我们用[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];覆盖此配置,但是在Catalina中,它不再起作用。