我有一个显示NSAlert窗口的多线程OSX应用程序。在大多数情况下,用户界面看起来很好,但有时会因错放看起来非常难看的按钮而打破用户界面。
因为我无法阻止主线程并且不想将其显示为模态。我正在使用以下代码。
NSAlert* alert = [NSAlert alertWithMessageText:title defaultButton:defaultBtn alternateButton:alterBtn otherButton:otherBtn informativeTextWithFormat:msg];
[alert setAlertStyle:style];
BOOL isMainThread = (dispatch_get_current_queue() == dispatch_get_main_queue());
if(isMainThread)
[alert layout];
else
{
dispatch_sync(dispatch_get_main_queue(), ^{
[alert layout];
});
}
NSModalSession session = [NSApp beginModalSessionForWindow:alert.window];
__block NSUInteger response;
for (;;) {
if(isMainThread)
{
response = [NSApp runModalSession:session];
}
else
{
dispatch_sync(dispatch_get_main_queue(), ^{
response = [NSApp runModalSession:session];
});
}
if(response != NSRunContinuesResponse)
break;
}
知道为什么会这样吗?
答案 0 :(得分:1)
-layout
是一个好主意?-beginModalSessionForWindow:
,而不是主要的NSAlert
的目的不是让你为它运行模态会话,或者接管它的演示而是使用NSAlert
或-runModal
-beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo: