objective-ccocoamacosnsalert

Make a NSAlert the topmost window?


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:

enter image description here

See how the window isn't selected? Is there any way around this without changing my whole app window level? Thanks!


Solution

  • 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];
    }