NSAlert показывает неуместные кнопки

У меня есть многопоточное приложение OSX, которое показывает окно NSAlert. В большинстве случаев пользовательский интерфейс выглядит нормально, но иногда он ломает пользовательский интерфейс, помещая кнопку, которая выглядит очень некрасиво.

Поскольку я не могу заблокировать основной поток и не хочу показывать его как модальный. Я использую следующий код.

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

Есть идеи, почему это происходит?

1 ответ

Вау, это какой-то серьезно испорченный код, который у вас там есть.

  • Как ты решил позвонить -layout была необходима хорошая идея?
  • AppKit не является потокобезопасным; ты не должен звонить -beginModalSessionForWindow: из любого потока, кроме основного
  • NSAlert не предназначен для того, чтобы позволить вам запустить модальный сеанс для него или принять его презентацию

Вместо этого позвоните NSAlert непосредственно в основной теме -runModal или же -beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:

Другие вопросы по тегам