2011-08-17 17 views
7

Estoy usando MPMoviePlayerController en iOS. Estoy escuchando cualquier error que pueda tener al reproducir videos. En mis controladores de errores, aparece un UIAlertView. En ocasiones, pueden producirse errores en sucesión rápida entre sí y, por lo tanto, se acumularán múltiples cuadros de alerta. Para una mejor experiencia de usuario, deseo no mostrar otra alerta si aún se muestra una anterior.¿Cómo evitar que varios UIAlertView se acumulen?

Respuesta

5

Prueba esto:

Establecer un valor lógico a true cuando usted hace estallar una alerta, configurarlo para que false cuando se cierra una alerta, y siempre comprobar el booleano para ver si es true antes de que el pop hasta un evento. Si es true, sabrá que ya tiene una ventana de alerta.

You can find this solution and some other discussion here.

+0

. El código que pegaste es igual de malo que usar SPI, y aunque probablemente no te rechace (porque es difícil encontrar la vista parcial como lo haces), es algo que con razón * debería * hacerte rechazar desde la aplicación almacenar. También hace suposiciones sobre cómo funciona UIAlertView y podría romper con una actualización del sistema operativo. –

+0

Gracias, eliminé esa parte de mi respuesta. – mopsled

1

Puede implementar esto trivialmente. Como muestra la alerta y también es el delegado de la alerta para saber cuándo se ha ido, puede rastrear fácilmente si hay una alerta visible simplemente configurando una bandera booleana al mostrar la alerta y ocultar la alerta. De esta forma, si se establece booleano, puede anular cualquier alerta posterior.

+0

A veces las alertas del sistema se abren y causan un comportamiento extraño :( – powerj1984

0

Hasta donde yo sé, la única forma es realizar un seguimiento de si actualmente se está mostrando o no una alerta y de si se está descartando una dentro de la aplicación. Intente mostrar la alerta en la aplicaciónDelegate y luego use una notificación para notificar a la aplicaciónDelegate cada vez que se cierre la alerta. De esta forma, la aplicación delegada realiza un seguimiento de si hay una alerta con una variable de bandera booleana.

1

Cuando aparece una alerta, se moverá a _UIAlertOverlayWindow. Por lo tanto, un método bastante frágil es iterar a través de todas las ventanas y verificar si hay alguna subvista 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; 
} 

Esto no está documentado, ya que depende de la jerarquía de la vista interna, aunque Apple no puede quejarse de esto. Un método más confiable, pero aún más indocumentado es comprobar si `

[_UIAlertManager visibleAlert]

` es nula.

Estos métodos no pueden verificar si se muestra un UIAlertView de SpringBoard.

0

Utilice el nuevo UIAlertViewController. Si intentas presentar una alerta mientras hay otra a la vista, la ignora y muestra la advertencia que se muestra a continuación. Es un efecto secundario desagradable para las personas que desean el comportamiento tradicional de las alertas apiladas, pero para su caso es una buena solución.

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

Se debe trabajar:

-(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 
} 
Por supuesto que no