2011-08-17 10 views
7

Używam MPMoviePlayerController w iOS. Słucham wszelkich błędów, które mogą mieć podczas odtwarzania filmów. W moich procedurach obsługi błędów pojawia się UIAlertView. Czasami błędy mogą występować w krótkim odstępie czasu, a zatem wiele pól alarmowych będzie się układać w stosy. Dla lepszego komfortu użytkownika nie chcę wyświetlać kolejnego alertu, jeśli wcześniej wyświetlany jest jeszcze jeden.Jak zapobiegać gromadzeniu się wielu UIAlertView?

Odpowiedz

5

Spróbuj tego:

ustawiona wartość logiczną do true gdy pojawi się alarm, ustawić go na false po zamknięciu alert, i zawsze sprawdzić wartość logiczną, aby zobaczyć, czy to true zanim pojawi się zdarzenie. Jeśli jest to true, będziesz wiedział, że masz już okno alertu.

You can find this solution and some other discussion here.

+0

Absolutnie. Kod, który wkleiłeś jest tak samo zły, jak używanie SPI, i chociaż prawdopodobnie nie zostanie odrzucony (ponieważ trudno jest znaleźć pokręty typu podgląd, tak jak robisz), jest to coś, co słusznie * powinno * spowodować odrzucenie Cię z aplikacji sklep. Przedstawia również założenia dotyczące działania UIAlertView i może złamać aktualizację systemu operacyjnego. –

+0

Dzięki, usunąłem tę część mojej odpowiedzi. – mopsled

1

Możesz to zaimplementować samemu banalnie. Ponieważ wyświetlasz alert, a Ty także jesteś delegatem alarmu, dzięki czemu wiesz, kiedy go nie ma, możesz łatwo sprawdzić, czy alert jest widoczny po ustawieniu flagi boolowskiej po wyświetleniu alertu i ostrzeżenia. W ten sposób, jeśli ustawiona jest wartość boolowska, możesz anulować wszystkie kolejne alerty.

+0

Czasami wyskakuje alert systemowy i powoduje dziwne zachowanie :( – powerj1984

0

O ile mi wiadomo, jedynym sposobem jest śledzenie, czy alert jest aktualnie wyświetlany i/lub aktualnie jest on odrzucany w aplikacji. Spróbuj wyświetlić alert w appDelegate, a następnie za pomocą powiadomienia powiadom powiadomienie appDelegate za każdym razem, gdy alert zostanie zamknięty. W ten sposób appDelegate śledzi, czy istnieje alert z boolowską zmienną flagową.

1

Po wyświetleniu alertu zostanie on przeniesiony do katalogu _UIAlertOverlayWindow. Dlatego dość kruchą metodą jest iteracja przez wszystkie okna i sprawdzenie, czy są jakieś subviews 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; 
} 

Jest to dokument nieudokumentowany, ponieważ zależy on od wewnętrznej hierarchii widoków, chociaż Apple nie może narzekać na to. Bardziej wiarygodne, lecz jeszcze bardziej nieudokumentowana metoda polega na sprawdzeniu, czy `

[_UIAlertManager visibleAlert]

` jest zerowa.

Te metody nie pozwalają sprawdzić, czy wyświetlany jest UIAlertView z SpringBoard.

0

Użyj nowego kontrolera UIAlertViewController. Jeśli spróbujesz wyświetlić alert, gdy inny jest widoczny, ignoruje go i wyświetla ostrzeżenie pokazane poniżej. To nieprzyjemny skutek dla osób, które chcą tradycyjnego zachowania ułożonych alarmów, ale dla twojego przypadku to dobre rozwiązanie.

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

To powinno działać:

-(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 
} 
nie