【问题标题】:Set level for NSAlert in Cocoa在 Cocoa 中为 NSAlert 设置级别
【发布时间】:2015-12-26 13:11:35
【问题描述】:

在我的应用程序中,我对 NSWindow 进行了子类化并将窗口级别设置为 25。由于窗口级别为 25,因此窗口隐藏了警报框和错误对话框。

有没有机会设置 NSAlert 的级别

【问题讨论】:

    标签: objective-c macos cocoa modal-dialog nsalert


    【解决方案1】:

    首先。你不应该使用像 25 这样的幻数。

    有一种方法可以设置窗口级别,但是没有用,因为runModal 使用固定的windowLevel 常量kCGModalPanelWindowLevel,即8。您可以这样验证:

    [self.window setLevel:25];
    NSAlert *alert = [NSAlert alertWithMessageText:@"1" defaultButton:@"2" alternateButton:nil otherButton:nil informativeTextWithFormat:@"3"];
    [alert runModal];
    

    (lldb) po [alert.window valueForKey:@"level"]

    8

    #define NSModalPanelWindowLevel kCGModalPanelWindowLevel
    

    解决方案:

    1. 使用表格

      [alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse response){ }];
      
    2. 使用您自己的实现 runModal。

    3. 将NSAlert功能重新创建为NSWindow/NSPanel的子类(不要继承NSAlert),如果需要显示它,请调用showWindow:。

    【讨论】:

    • 我想知道 NSAlert 在什么时候设置窗口级别?查看上面的代码 sn-p,可以在 [alert runModal] 之前执行 [alert.window setLevel:whatever] 吗?如果 NSAlert 在构建时设置它的窗口,或者根据需要延迟设置,那么这可能会起作用,但如果 runModal 设置它,那么就没有骰子了......
    • runModals 内部实现将重置窗口级别,因此它没用。如果你想用更少的努力在上面使用最高级别 7。否则你必须编写一些代码。如果您不需要模态行为,您也可以尝试在 nsalert 的内部窗口上使用 showWindow。但是你必须测试它。从来没有那样用过。
    【解决方案2】:

    你可以这样做,但这是一个非常糟糕的组合。诀窍是在runModal 启动后运行一些代码 并设置警报窗口的级别。在调用runModal 重新设置NSAlert 之后的级别之前,请执行以下操作。

    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSApp modalWindow] setLevel:myLevel];
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-29
      • 2023-04-09
      • 2013-02-27
      • 2012-02-22
      • 2015-10-16
      • 2023-03-18
      • 1970-01-01
      • 2013-07-17
      相关资源
      最近更新 更多