我正在嘗試使用代碼在本頁中描述的簡約 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;
}
我的問題是,應用程式選單在我重新激活其視窗(激活另一個應用程式,然后單擊回傳我的應用程式視窗)之前沒有回應。
知道為什么以及如何解決它嗎?
uj5u.com熱心網友回復:
當您嘗試呼叫時,AppKit 仍處于應用的啟動階段[NSApp activateIgnoringOtherApps:YES];
。正確的方法是通過以下方式處理它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];
});
暗示這是正確的做法。
uj5u.com熱心網友回復:
好的...我找到了解決方案...我必須更換
[NSApp activateIgnoringOtherApps:YES];
和:
dispatch_async(dispatch_get_main_queue(), ^{
[NSApp activateIgnoringOtherApps:YES];
});
我不知道為什么,但它有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504399.html
上一篇:PAGE_EXECUTE_READWRITE作為VirtualAlloc中的一個選項的存在是否意味著W^X僅在Windows中由DEP提供便利?