2015-10-26 26 views
3

我建立我的自定义应用程序CustomApplication@implementation我用下面的代码可可应用程序中的菜单栏:Cocoa应用程序菜单栏不可点击

+(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]]; 
} 

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

我错过了什么吗?


UPDATE

当我创建的应用程序如下该方法被调用。 [更新]这就是我开始我的应用程序。它实际上是从一个类的任何@implementation以外的ocaml绑定中被调用的第一件事。

CustomApplicationDelegate* delegate = [CustomApplicationDelegate new]; 

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

[[NSApplication sharedApplication] setDelegate:delegate]; 

[CustomApplication setUpMenuBar]; 

[[CustomApplication sharedApplication] finishLaunching]; 
+0

您还没有说过如何/何时调用了此setUpMenuBar方法。我还建议将[NSApp setMainMenu:mainMenu]调用移到该函数的末尾,以便在NSApp完成设置后将菜单提供给NSApp;我可以想象,NSApp解析它给出的菜单结构并缓存关于它的信息,这可能解释了为什么它最初是不起作用的。总的来说,我的反应是:“呃,你为什么要这样做而不是使用笔尖?”但我试图压制我的反应...... – bhaller

+0

好吧,我编辑了我的消息以提供更多信息。至于我为什么决定不使用笔尖,我实际上正在研究一个跨平台的库。 –

+0

哦,你的解决方案不起作用,无论如何,谢谢。 –

回答

5

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

我实际上将我的呼叫转移给代表如下。

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

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

    [NSApp activateIgnoringOtherApps:YES]; 
} 
+0

好,很好。我想我应该已经发布了所有答案,所以我得到了信任。 : - >所以,对于后代来说,究竟是什么问题呢?是否activateIgnoringOtherApps:调用还为时过早? – bhaller

+0

如果你愿意,你依然可以。但重组方法调用是不够的。例如,如果我在第二个'setActivationPolicy'中,在'activate'发生同样的问题之前,这个顺序在同一个函数中不起作用。 –

+0

嗯,很奇怪。那么,简而言之,为什么使用最小化的笔尖而不是从头开始构建菜单栏是一个好主意。因为从来没有人从头开始构建UI,这是一个基本未经测试的案例,可能会暴露Cocoa中各种奇怪的错误和顺序依赖。不仅如此,那些奇怪的错误和顺序依赖性可能会随着OS X的发布而变化。我预测,通过从nib开始,您可以防止许多离奇的OS-X版本依赖问题。 – bhaller

1

我有这个问题,究其原因,是因为我对[NSApp activateIgnoringOtherApps:YES]电话是在applicationWillFinishLaunching:而不是applicationDidFinishLaunching:

只要我将它移开,菜单栏首先启动。

相关问题