NSAlert可以用于创建浮动窗口吗?

8
我有一个Cocoa应用程序,使用NSAlert类显示应用程序模态警报。我希望警报窗口浮动在所有其他应用程序的窗口上方。这可以使用NSAlert完成,还是需要实现自己的窗口?
我不知道这是否重要,但该应用程序是作为NSStatusItem实现的代理应用程序(LSUIElement为true)。 (有关应用程序的更多信息,包括源代码,请参见<here>。)
以下是显示警报的代码:
- (void)showTimerExpiredAlert {
    [NSApp activateIgnoringOtherApps:YES];

    NSAlert *alert = [[NSAlert alloc] init];
    [alert setAlertStyle:NSInformationalAlertStyle];
    [alert setMessageText:NSLocalizedString(@"Menubar Countdown Complete", @"Expiration message")];
    [alert setInformativeText:NSLocalizedString(@"The countdown timer has reached 00:00:00.",
                                                @"Expiration information")];
    [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button title")];
    [alert addButtonWithTitle:NSLocalizedString(@"Restart Countdown...", @"Restart button title")];

    NSInteger clickedButton = [alert runModal];
    [alert release];

    if (clickedButton == NSAlertSecondButtonReturn) {
        // ...
    }
}

runModal调用之前,我尝试放置了以下内容:

[[alert window] setFloatingPanel:YES];

我也尝试了这个:

[[alert window] setLevel:NSFloatingWindowLevel];

但是,如果我点击另一个应用程序的窗口,这两个设置都无法使窗口保持在其他窗口之上。 我怀疑runModal没有遵守这两个设置。


1
每当调用runModal时,它会重置窗口级别,不确定这是否有帮助... - cobbal
2个回答

5

我曾经花费很长时间思考这个问题。

我能够使它工作的唯一方法(有点),是创建一个NSApplication子类,并覆盖-sendEvent方法。在-sendEvent中,您首先调用super的实现,然后执行以下操作:

id *modalWindow = [self modalWindow];
if (modalWindow && [modalWindow level] != MY_DESIRED_MODAL_WINDOW_LEVEL)
    [modalWindow setLevel: MY_DESIRED_MODAL_WINDOW_LEVEL];

除此之外,即使这种方法也不完美 - 当切换应用程序时 - 你也不会想这样做,因为这是一个明显的,粗糙的hack。
所以,是的,遗憾的是你最好编写自己的NSAlert版本。如果你真的关心这个可能性,我建议你提bug。很奇怪的是,[[alert window] setLevel: someLevel]没有被NSApplication认可,这浪费了重新构建NSAlert及其所有小而巧妙的自动布局功能的时间。

2
我最终做的是放弃 NSAlert ,而是从 NIB 中加载一个类似于警告的 NSWindow
以下是显示窗口的代码:
- (void)showAlert {
    NSWindow *w = [self window];
    [w makeFirstResponder:nil];
    [w setLevel:NSFloatingWindowLevel];
    [w center];
    [w makeKeyAndOrderFront:self];
}

这意味着它会像警报一样工作,但它也浮动,并且不是模态的,因此当它出现时可以选择菜单项。

我还需要做些什么吗?


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