问题
I've created the main window in my application to have these settings:
[self setLevel:kCGDesktopWindowLevel + 1];
[self setCollectionBehavior:
(NSWindowCollectionBehaviorCanJoinAllSpaces |
NSWindowCollectionBehaviorStationary |
NSWindowCollectionBehaviorIgnoresCycle)];
It's a very custom window that sort of floats above the desktop.
In addition, it's a menu-bar application (LSUIElement
).
Alright, so I need to display an alert if something isn't right. Here's how I'm doing it:
NSAlert *alert = [NSAlert alertWithMessageText:@""
defaultButton:@""
alternateButton:@""
otherButton:@""
informativeTextWithFormat:@""];
[alert runModal];
Of course I have filled in the buttons and other text.
Here's my problem: When my application is not currently the key application, and this alert pops up, it's not a key window. Like this:
See how the window isn't selected? Is there any way around this without changing my whole app window level? Thanks!
回答1:
Have you tried activating your application in the code that displays the alert?
[[NSRunningApplication currentApplication] activateWithOptions:0];
If passing 0 doesn't work, you can pass NSApplicationActivateIgnoringOtherApps
as your option, but Apple recommends against it unless really necessary (see docs for NSRunningApplication).
Update: You have activate before running the alert. This works for me in a new app with LSUIElement set:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSAlert *alert = [NSAlert alertWithMessageText: @"Blah"
defaultButton: @"Blah"
alternateButton: @"Blah"
otherButton: @"Blah"
informativeTextWithFormat: @"Blah"];
[[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
[alert runModal];
}
回答2:
If you want to support 10.5 also. you can use
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
回答3:
Forcing an application to move forefront is a rather bad idea. One would probably prefer to make the alert floating over everything using the dedicated NSPanel property 'floatingPanel':
NSPanel* panel = static_cast<NSPanel*>([alert window]);
panel.floatingPanel = YES;
来源:https://stackoverflow.com/questions/5269116/make-a-nsalert-the-topmost-window