【发布时间】:2015-12-26 13:11:35
【问题描述】:
在我的应用程序中,我对 NSWindow 进行了子类化并将窗口级别设置为 25。由于窗口级别为 25,因此窗口隐藏了警报框和错误对话框。
有没有机会设置 NSAlert 的级别
【问题讨论】:
标签: objective-c macos cocoa modal-dialog nsalert
在我的应用程序中,我对 NSWindow 进行了子类化并将窗口级别设置为 25。由于窗口级别为 25,因此窗口隐藏了警报框和错误对话框。
有没有机会设置 NSAlert 的级别
【问题讨论】:
标签: objective-c macos cocoa modal-dialog nsalert
首先。你不应该使用像 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
解决方案:
使用表格
[alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse response){ }];
使用您自己的实现 runModal。
将NSAlert功能重新创建为NSWindow/NSPanel的子类(不要继承NSAlert),如果需要显示它,请调用showWindow:。
【讨论】:
你可以这样做,但这是一个非常糟糕的组合。诀窍是在runModal 启动后运行一些代码 并设置警报窗口的级别。在调用runModal 重新设置NSAlert 之后的级别之前,请执行以下操作。
dispatch_async(dispatch_get_main_queue(), ^{
[[NSApp modalWindow] setLevel:myLevel];
});
【讨论】: