2010-12-06 5 views
10

Dans mon application iOS, j'ai une minuterie allumée, et quand elle se déclenche, je dois être capable de détecter s'il y a une alerte (UIAlertView) ou une feuille d'action (UIActionSheet) ouvert. Un moyen serait de modifier le code présentant les alertes/actions - mais malheureusement ce n'est pas une option dans mon cas. Donc, la question est - existe-t-il un moyen de savoir/détecter si une alerte ou une feuille d'action ont été ouvertes?iPhone: détecter si une UIAlert/UIActionSheet est ouverte

Y a-t-il des notifications envoyées lors de l'ouverture ou un parcours de la hiérarchie de vue pour la détecter?

Merci

Répondre

17

Ils le font envoyer une alerte quand ils ouvrent, mais seulement à leur delegate - Vérifier this question une approche agréable de ce problème. Techzen recommande de définir un indicateur booléen sur YES lorsque vous ouvrez l'alerte et de la rétablir sur NO lorsque vous fermez l'alerte.

EDIT:

Puisque vous n'avez pas accès à tout le code, pourquoi ne pas essayer ce morceau maladroit de code:

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

MERCI! J'ai dû appliquer deux changements à la proposition: (1) sous-vues dans un NSArray * et non UIView *. (2) On dirait que la UIActionSheet n'est pas la première sous-vue [0], mais la seconde [1]. Donc, j'ai itéré la hiérarchie de vue ... Code est affiché comme réponse ... – Reuven

+0

J'ai utilisé l'autre suggestion de TechZen de conserver une référence. J'ai trouvé cela a fonctionné très élégamment. –

+1

Cela fonctionnera-t-il également avec 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

bonjour je suis également confronté au même problème que j'ai essayé avec le code ci-dessus cependant quand j'essaye d'imprimer le tableau de "window.subviews", ne recevant aucun objet de uiactionsheet. Avant ceci j'ai gardé ouvert une feuille d'action. Quel peut être le problème svp donner une solution sur ce – user968597

+0

J'ai seulement utilisé ce code sur un iPhone - peut-il être vous l'utilisez sur un iPad? – Reuven

+0

Ne fonctionne pas du tout sur l'ipad. :( – Tarun

2

Vous pouvez également vérifier la fenêtre de la vue propriété:

if(actionSheet.window) 
    isBeingPresented = YES; 
1

merci pour l'aide, mais depuis iOS 6, le morceau de code ne fonctionne plus. Cependant, j'ai corrigé le problème avec ce code. Espérons que cela aide

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 détection des alertes semble relativement facile, mais les feuilles d'action m'ont bloqué. Dans iOS 6.1 je devais aller un peu plus loin

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

Dans iOS 7, ce code fonctionne pour les feuilles d'action, mais il ne fonctionne plus pour les vues d'alerte.Semble la meilleure solution pour les alertes est de garder une trace de leur ... 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; 
     } 
} 
Questions connexes