NSAlert显示错位的按钮

时间:2012-06-20 02:11:06

标签: objective-c ios macos cocoa cocoa-design-patterns

我有一个显示NSAlert窗口的多线程OSX应用程序。在大多数情况下,用户界面看起来很好,但有时会因错放看起来非常难看的按钮而打破用户界面。

enter image description here

因为我无法阻止主线程并且不想将其显示为模态。我正在使用以下代码。

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 个答案:

答案 0 :(得分:1)

哇,这是你遇到的一些严重错误的代码。

  • 你是如何决定调用-layout是一个好主意?
  • AppKit不是线程安全的;你不应该从任何线程中呼叫-beginModalSessionForWindow:,而不是主要的
  • NSAlert的目的不是让你为它运行模态会话,或者接管它的演示

而是使用NSAlert-runModal

直接在主线程上调用-beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo: