2010-12-06 11 views
10

En mi aplicación iOS, tengo un temporizador encendido, y cuando se dispara, necesito poder detectar si hay una alerta (UIAlertView) o una hoja de acción (UIActionSheet)) abierto.iPhone: detectando si hay una UIAlert/UIActionSheet abierta

Una forma sería modificar el código que presenta las alertas/hojas de acciones, pero lamentablemente esta no es una opción en mi caso.

Entonces, la pregunta es: ¿hay alguna manera de saber/detectar si se ha abierto una alerta o una hoja de acción?

¿Hay notificaciones enviadas al abrir, o cualquier cruce de la jerarquía de vista para detectarlo?

Gracias

Respuesta

17

Hacen enviar una alerta cuando se abren, pero sólo a su delegate - Comprobar this question para un acercamiento agradable a ese problema. Techzen recomienda establecer un indicador booleano en YES cuando abre la alerta y lo configura de nuevo en NO cuando cierra la alerta.

EDIT:

Puesto que usted no tiene acceso a todos al código, por qué no probar esta pieza torpe de código:

-(BOOL) doesAlertViewExist { 
    for (UIWindow* window in [UIApplication sharedApplication].windows) { 
    NSArray* subviews = window.subviews; 
    if ([subviews count] > 0) { 

     BOOL alert = [[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]]; 
     BOOL action = [[subviews objectAtIndex:0] isKindOfClass:[UIActionSheet class]]; 

     if (alert || action) 
     return YES; 
    } 
    } 
    return NO; 
} 
+2

GRACIAS! Tuve que aplicar dos cambios a la propuesta: (1) subvistas en un NSArray * y no en UIView *. (2) Parece que UIActionSheet no es la primera subvista [0], sino que la segunda [1]. Así que repetí la jerarquía de vista ... El código se publicó como respuesta ... – Reuven

+0

Utilicé otra sugerencia de TechZen de conservar una referencia. Encontré que esto funcionó muy elegantemente. –

+1

¿Funcionará también con iOS 7? –

12
- (BOOL) doesAlertViewExist { 
    for (UIWindow* window in [UIApplication sharedApplication].windows) { 
     for (UIView* view in window.subviews) { 
      BOOL alert = [view isKindOfClass:[UIAlertView class]]; 
      BOOL action = [view isKindOfClass:[UIActionSheet class]]; 
      if (alert || action) 
       return YES; 
     } 
    } 
    return NO; 
} 
+0

hola también estoy enfrentando el mismo problema que probé con el código anterior, sin embargo, cuando trato de imprimir la matriz de "window.subviews", no obtengo ningún objeto de uiactionsheet. Antes de esto, mantuve abierta una hoja de acción. ¿Cuál puede ser el problema? dar alguna solución en este – user968597

+0

Solo he usado este código en un iPhone, ¿puede ser que lo esté usando en un iPad? – Reuven

+0

No funciona en absoluto en el ipad. :( – Tarun

2

también se puede comprobar por la ventana de la vista propiedad:

if(actionSheet.window) 
    isBeingPresented = YES; 
1

gracias por la ayuda, pero desde iOS 6, la pieza de código ya no funciona. Sin embargo, solucioné el problema con este código. Espero que esto ayude

for (UIWindow* window in [UIApplication sharedApplication].windows) { 
    NSArray* subviews = window.subviews; 
    if ([subviews count] > 1) { 
     BOOL alert = [[subviews objectAtIndex:1] isKindOfClass:[UIAlertView class]]; 
     BOOL action = [[subviews objectAtIndex:1] isKindOfClass:[UIActionSheet class]]; 

     if (alert || action) 
      return YES; 
    } 
} 
return NO; 
2

La detección de alertas parece relativamente fácil, pero las hojas de acción me han dejado perplejo. En iOS 6.1 que tenía que ir un paso más allá

BOOL IsActionOpen(UIView* aView) { 
BOOL actionOpen = NO; 
if (aView) { 
    if ([aView isKindOfClass:[UIActionSheet class]]) { 
     actionOpen = YES; 
    } 
    else if (aView.subviews.count > 0) { 
     for (UIView* aSubview in aView.subviews) { 
      if (IsActionOpen(aSubview)) { 
       actionOpen = YES; 
       break; 
      } 
     } 
    } 
} 
return actionOpen; 

}

- (BOOL) isAnActionSheetOpen { 
BOOL actionOpen = NO; 
for (UIWindow* w in [UIApplication sharedApplication].windows) { 
    actionOpen = IsActionOpen(w); 
    if (actionOpen) 
     break; 
} 
return actionOpen; 

}

+0

En iOS 7, este código funciona para las hojas de acción, pero ya no funciona para las vistas de alerta. Parece que la mejor solución para las vistas de alerta es hacer un seguimiento de ellas ... http://stackoverflow.com/q/18702565/268153 –

1
-(BOOL)GetKeyWindow {  
     UIViewController *presentedViewController = myAppDelegate.window.rootViewController.presentedViewController; 

     if (presentedViewController) { 

      if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {   

       return YES; 
      }else{ 
       return NO; 
       NSLog(@"not present"); 
      } 
     } 
     else{ 
      return NO; 
     } 
} 
Cuestiones relacionadas