0

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;
}

なぜこれが起こっているのか考えていますか?

4

1 に答える 1

1

うわー、それはあなたが持っている深刻な混乱したコードです。

  • 通話-layoutが必要であると判断したのはなぜですか?
  • AppKit はスレッド セーフではありません。-beginModalSessionForWindow:メインスレッド以外のスレッドから呼び出すべきではありません
  • NSAlertモーダルセッションを実行したり、プレゼンテーションを引き継いだりするようには設計されていません

代わりに、またはのいずれかを使用して、メイン スレッドで直接呼び出しますNSAlert-runModal-beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:

于 2012-06-20T17:58:03.460 に答える