2011-08-17 13 views
7

Sto usando MPMoviePlayerController in iOS. Sto ascoltando eventuali errori durante la riproduzione di video. Nei miei gestori degli errori, ho visualizzato uno UIAlertView. A volte gli errori possono verificarsi in rapida successione l'uno dall'altro e quindi più caselle di avviso si impilano. Per una migliore esperienza utente, non desidero far apparire un altro avviso se uno dei precedenti è ancora visualizzato.Come evitare che UIAlertView si accumuli?

risposta

5

Prova questo:

Impostare un valore booleano per true quando si pop-up un avviso, impostarlo su false quando si chiude un avviso, e controllare sempre la booleana per vedere se è true prima di pop up di un evento. Se è true, saprai che hai già una finestra di avviso.

You can find this solution and some other discussion here.

+0

. Il codice che hai incollato è tanto pessimo quanto usare SPI, e anche se probabilmente non ti farà rifiutare (perché è difficile trovare la sottoview che pasticcia come stai facendo), è qualcosa che giustamente * dovrebbe * farti rifiutare dall'app negozio. Sta anche facendo supposizioni su come funziona UIAlertView e potrebbe interrompersi su un aggiornamento del sistema operativo. –

+0

Grazie, ho rimosso quella parte della mia risposta. – mopsled

1

È possibile implementarlo da soli. Dato che stai visualizzando l'avviso e sei anche il delegato della segnalazione in modo da sapere quando è finito, puoi facilmente monitorare se c'è un avviso visibile semplicemente impostando una bandiera booleana sulla segnalazione di allerta e avviso. In questo modo se il valore booleano è impostato, puoi annullare tutti gli avvisi successivi.

+0

A volte gli avvisi di sistema popup e causano un comportamento strano :( – powerj1984

0

Per quanto ne so, l'unico modo è quello di tenere traccia o meno di un avviso attualmente visualizzato e/o uno è attualmente in fase di eliminazione all'interno dell'applicazione. Prova a mostrare l'avviso nell'appDelegate e quindi a utilizzare una notifica per notificare l'appDelegate ogni volta che l'avviso viene chiuso. In questo modo, l'AppDelegate tiene traccia della presenza o meno di un avviso con una variabile flag booleana.

1

Quando viene visualizzato un avviso, verrà spostato su _UIAlertOverlayWindow. Pertanto, un metodo piuttosto fragile è quello di scorrere tutte le finestre e controllare se ci sono delle sotto-visualizzazioni di 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; 
} 

Questo è documentato in quanto dipende dalla gerarchia vista interna, anche se Apple non può lamentarsi di questo. Un metodo più affidabile, ma anche più documentato è quello di verificare se `

[_UIAlertManager visibleAlert]

` è pari a zero.

Questi metodi non possono controllare se viene visualizzato UIAlertView da SpringBoard.

0

Utilizzare il nuovo UIAlertViewController. Se si tenta di presentare un avviso mentre un altro è in vista, lo ignora e emette l'avviso mostrato di seguito. È un cattivo effetto collaterale per le persone che vogliono il comportamento tradizionale degli avvisi impilati, ma per il tuo caso è una buona soluzione.

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

Dovrebbe funzionare:

-(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 
} 
Assolutamente no
Problemi correlati