在Cocoa中设置NSAlert的级别

时间:2015-09-29 06:52:06

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

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

是否有机会设置NSAlert的等级

2 个答案:

答案 0 :(得分:3)

首先。你不应该使用像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. Swizzle实现runModal和你自己的。

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

答案 1 :(得分:0)

您可以执行此操作,但这是一个很大的麻烦。诀窍是在runModal启动后运行一些代码 并设置警报窗口的级别。在进行runModal之后,请调用NSAlert重新设置电平。

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