2011-08-17 62 views
7

我在iOS中使用MPMoviePlayerController。我正在收聽播放視頻時可能遇到的任何錯誤。在我的錯誤處理程序中,我彈出一個UIAlertView。有時候錯誤可能會相互快速發生,因此多個警報框會疊加起來。爲了更好的用戶體驗,如果仍然顯示較早的警報,我不希望彈出另一個警報。如何防止疊加多個UIAlertView?

回答

5

試試這個:

設置一個布爾值,true當你彈出一個警告,它設置爲false當您關閉警報,並經常檢查布爾值,看它是否是true你彈出一個事件之前。如果它是true,則會知道您已經有一個警告窗口顯示。

You can find this solution and some other discussion here

+0

絕對不是。你粘貼的代碼與使用SPI一樣糟糕,雖然它可能不會讓你被拒絕(因爲你很難找到子視圖戳),這是正確的*應該*讓你從應用中被拒絕商店。它也在假設UIAlertView是如何工作的,並且可能會在操作系統更新中破壞。 –

+0

謝謝,我已經刪除了我的答案的一部分。 – mopsled

1

你可以自己實現這一點。由於您正在顯示警報,並且您也是警報的代表,所以您可以知道警報何時消失,只需在警報顯示和警報隱藏時設置布爾標誌,您就可以輕鬆跟蹤是否有警報可見。這樣,如果設置了布爾值,則可以撤銷任何後續警報。

+0

有時系統警報彈出並導致奇怪的行爲:( – powerj1984

0

據我所知,唯一的方法是跟蹤當前是否顯示警報和/或目前是否正在應用程序中解散警報。嘗試在appDelegate中顯示警報,然後在每次關閉警報時使用通知通知appDelegate。這樣,appDelegate會跟蹤是否存在具有布爾標誌變量的警報。

1

當出現警報時,它將被移至_UIAlertOverlayWindow。因此,一個非常脆弱的方法是迭代所有窗口並檢查是否有任何UIAlertView子視圖。

-(BOOL)checkAlertViewVisibleStatus 
{ 
    for (UIWindow* window in [UIApplication sharedApplication].windows) 
    { 
    NSArray* subviews = window.subviews; 
     if ([subviews count] > 0) 
     if ([[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]]) 
      return YES; 
    } 
return NO; 
} 

這是無證的,因爲它取決於內部視圖的層次結構,雖然蘋果公司不能抱怨這一點。一個更可靠的,但甚至更無證方法是檢查是否`

[_UIAlertManager visibleAlert]

`是零。

這些方法無法檢查是否顯示SpringBoard的UIAlertView。

0

使用新的UIAlertViewController。如果在另一個視圖中嘗試顯示警報,則忽略它並輸出下面顯示的警告。對於那些希望傳統堆疊警報行爲的人來說,這是一個令人討厭的副作用,但對於您的情況,這是一個很好的解決方案。

Warning: Attempt to present <UIAlertController: 0x7f9ef34c17e0> on <MasterViewController: 0x7f9ef344ec90> which is already presenting (null) 
0

它應該工作:

-(BOOL) doesAlertViewExist 
{ 
    if ([[UIApplication sharedApplication].keyWindow isMemberOfClass:[UIWindow class]]) 
    { 
     return NO;//AlertView does not exist on current window 
    } 
    return YES;//AlertView exist on current window 
}