2012-06-20 61 views
0

我有一個顯示NSAlert窗口的多線程OSX應用程序。大多數情況下用戶界面看起來不錯,但有時它通過錯位放置看起來非常難看的按鈕來破壞用戶界面。NSAlert顯示錯誤的按鈕

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

哇,這是一些嚴重混亂的代碼,你在那裏。

  • 你是怎麼決定打電話-layout是一個好主意的必要嗎?
  • AppKit不是線程安全的;你不應該從任何線程-beginModalSessionForWindow:但主要
  • NSAlert的目的不是爲了讓你運行它一個模式會話,或者接管它呈現

而是直接調用NSAlert在主線程與-runModal-beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:

+0

根本不應該使用模態會話。該特定的API是非正式的棄用。 –