如何将NSAlert设为最上层窗口?

10

我在应用程序中创建了主窗口,并设置了以下内容:

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

这是一个非常独特的窗口,有点像漂浮在桌面上。

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

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

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

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

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

enter image description here

看到窗口没有被选中吗?有没有什么办法可以解决这个问题,而不必改变整个应用程序窗口级别?谢谢!
4个回答

12

你尝试在显示警告的代码中激活你的应用程序了吗?

[[NSRunningApplication currentApplication] activateWithOptions:0];

如果传递0不起作用,你可以将NSApplicationActivateIgnoringOtherApps作为选项传递,但除非真正需要(请参见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];
}

不幸的是,这样做仍然无法解决问题。 - sudo rm -rf
你是在 runModal 调用之前还是之后添加的?runModal 会阻塞,所以你必须先放置 NSRunningApplication 调用。请参见更新的答案。 - skue
3
[NSApp activateIgnoringOtherApps:YES] 的翻译是:激活应用程序并忽略其他应用程序。 - Mugen
如果这仍然对您不起作用,请确保它是在[alert runModal]之前的那一行。 - a paid nerd

2

强制将应用程序移到前台是一个相当不好的想法。 我们可能更喜欢使用专用的NSPanel属性'floatingPanel'使警报浮动在所有内容上:

NSPanel* panel = static_cast<NSPanel*>([alert window]);
panel.floatingPanel = YES;

2

如果您也想支持10.5,可以使用以下方法:

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];

0
如果你需要确保 NSAlert 是最顶层的,请使用以下代码:
alert.window.level = NSFloatingWindowLevel;

否则,如果您希望默认按钮被突出显示,请使用(正如其他人所建议的):
[[NSApplication sharedApplication] activateIgnoringOtherApps : YES];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接