应用程序主NSMenu在没有重新激活窗口的情况下没有响应



我正在尝试本页中描述的极简主义Cocoa应用程序使用代码:

#import <Cocoa/Cocoa.h>;
int main ()
{
[NSAutoreleasePool new];
[NSApplication sharedApplication];
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
id menubar = [[NSMenu new] autorelease];
id appMenuItem = [[NSMenuItem new] autorelease];
[menubar addItem:appMenuItem];
[NSApp setMainMenu:menubar];
id appMenu = [[NSMenu new] autorelease];
id appName = [[NSProcessInfo processInfo] processName];
id quitTitle = [@"Quit " stringByAppendingString:appName];
id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle
action:@selector(terminate:) keyEquivalent:@"q"] autorelease];
[appMenu addItem:quitMenuItem];
[appMenuItem setSubmenu:appMenu];
id window = [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 200, 200)
styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO]
autorelease];
[window cascadeTopLeftFromPoint:NSMakePoint(20,20)];
[window setTitle:appName];
[window makeKeyAndOrderFront:nil];
[NSApp activateIgnoringOtherApps:YES];
[NSApp run];
return 0;
}

我的问题是,在我重新激活其窗口(激活另一个应用程序,然后单击回我的应用程序窗口(之前,应用程序菜单不会响应。

知道为什么以及如何解决吗?

当您尝试调用[NSApp activateIgnoringOtherApps:YES];时,AppKit仍处于应用程序的启动阶段。正确的方法是通过NSApplicationDelegate:进行处理

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (strong, nonatomic, class, readonly) AppDelegate* sharedInstance;
@end
@implementation AppDelegate
+ (instancetype)sharedInstance {
static AppDelegate *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [AppDelegate new];
});
return sharedInstance;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[NSApp activateIgnoringOtherApps:YES];
}
@end
int main ()
{
[NSAutoreleasePool new];
[NSApplication sharedApplication];
NSApplication.sharedApplication.delegate = [AppDelegate sharedInstance];
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
id menubar = [[NSMenu new] autorelease];
id appMenuItem = [[NSMenuItem new] autorelease];
[menubar addItem:appMenuItem];
[NSApp setMainMenu:menubar];
id appMenu = [[NSMenu new] autorelease];
id appName = [[NSProcessInfo processInfo] processName];
id quitTitle = [@"Quit " stringByAppendingString:appName];
id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle
action:@selector(terminate:) keyEquivalent:@"q"] autorelease];
[appMenu addItem:quitMenuItem];
[appMenuItem setSubmenu:appMenu];
id window = [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 200, 200)
styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO]
autorelease];
[window cascadeTopLeftFromPoint:NSMakePoint(20,20)];
[window setTitle:appName];
[window makeKeyAndOrderFront:nil];
[NSApp run];
return 0;
} 

作为奖励,代理人的- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {将在您的:之前被调用

dispatch_async(dispatch_get_main_queue(), ^{
[NSApp activateIgnoringOtherApps:YES];
});

暗示这是正确的方法。

好的。。。我找到了解决方案。。。我必须更换

[NSApp activateIgnoringOtherApps:YES];

带有:

dispatch_async(dispatch_get_main_queue(), ^{
[NSApp activateIgnoringOtherApps:YES];
});

我不知道为什么,但它有效。

最新更新