NSAlertウィンドウを表示しているマルチスレッドOSXアプリケーションがあります。ほとんどの場合、UIは問題ないように見えますが、非常に見苦しいボタンを置き忘れてUIが機能しなくなることがあります。
メインスレッドをブロックできず、モーダルとして表示したくないので。私は次のコードを使用しています。
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;
}
なぜこれが起こっているのか考えていますか?