10

我在我的应用程序中创建了主窗口以进行以下设置:

[self setLevel:kCGDesktopWindowLevel + 1];
[self setCollectionBehavior:
     (NSWindowCollectionBehaviorCanJoinAllSpaces | 
      NSWindowCollectionBehaviorStationary | 
      NSWindowCollectionBehaviorIgnoresCycle)];

这是一个非常自定义的窗口,有点漂浮在桌面上方。

此外,它是一个菜单栏应用程序 ( LSUIElement)。

好的,所以如果出现问题,我需要显示警报。这是我的做法:

NSAlert *alert = [NSAlert alertWithMessageText:@"" 
                                 defaultButton:@"" 
                               alternateButton:@"" 
                                   otherButton:@"" 
                     informativeTextWithFormat:@""];
[alert runModal];

当然,我已经填写了按钮和其他文本。

这是我的问题:当我的应用程序当前不是关键应用程序并且弹出此警报时,它不是关键窗口。像这样:

在此处输入图像描述

看看如何没有选择窗口?有没有办法在不改变我的整个应用程序窗口级别的情况下解决这个问题?谢谢!

4

3 回答 3

11

您是否尝试过在显示警报的代码中激活您的应用程序?

[[NSRunningApplication currentApplication] activateWithOptions:0];

如果传递 0 不起作用,您可以NSApplicationActivateIgnoringOtherApps作为选项传递,但 Apple 建议不要使用它,除非确实有必要(请参阅 NSRunningApplication 的文档)。


更新:您在运行警报之前已激活。这适用于我在设置了 LSUIElement 的新应用程序中:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSAlert *alert = [NSAlert alertWithMessageText: @"Blah"
                                     defaultButton: @"Blah"
                                   alternateButton: @"Blah"
                                       otherButton: @"Blah"
                         informativeTextWithFormat: @"Blah"];

    [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
    [alert runModal];
}
于 2011-03-11T05:35:24.587 回答
2

如果你也想支持10.5。您可以使用

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
于 2012-05-29T13:01:49.093 回答
2

强制应用程序移动到最前面是一个相当糟糕的主意。人们可能更愿意使用专用的 NSPanel 属性“floatingPanel”使警报漂浮在所有内容上:

NSPanel* panel = static_cast<NSPanel*>([alert window]);
panel.floatingPanel = YES;
于 2018-08-06T13:51:41.580 回答