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: