gpt4 book ai didi

cocoa - NSAlert可以用来创建 float 窗口吗?

转载 作者:行者123 更新时间:2023-12-03 16:06:32 25 4
gpt4 key购买 nike

我有一个 Cocoa 应用程序,它使用 NSAlert 类显示应用程序模式警报。我希望警报窗口 float 在所有其他应用程序窗口之上。这可以通过 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 只是不遵守这些设置。

最佳答案

不久前我为这件事伤透了脑筋。

我能让这个工作(某种程度上)的唯一方法是子类化 NSApplication 并覆盖 -sendEvent。在 -sendEvent 中,您首先调用 super 的实现,然后执行如下操作:

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

除此之外,即使这样也不能完美地工作 - 当切换应用程序时 - 你无论如何都不想这样做,因为这是一个公然、粗暴的黑客行为。

所以,是的,遗憾的是你最好编写自己的 NSAlert 版本。如果你真的关心这种可能性,我会提交一个错误。很奇怪的是 [[alert window] setLevel: someLevel] 没有被 NSApplication 所尊重,而且为了能够做到这一点而不得不重新构建 NSAlert 及其所有简洁的自动布局功能是一种浪费。

关于cocoa - NSAlert可以用来创建 float 窗口吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/765416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com