2010-12-06 11 views
10

In meiner iOS-Anwendung habe ich einen Timer gestartet, und wenn er ausgelöst wird, muss ich erkennen können, ob ein Alert (UIAlertView) oder ein Action Sheet (UIActionSheet) vorhanden ist) offen.iPhone: Erkennen, ob ein UIAlert/UIActionSheet geöffnet ist

Ein Weg wäre, den Code mit den Alerts/Actionsheets zu ändern - aber das ist in meinem Fall leider keine Option.

Die Frage ist also - gibt es eine Möglichkeit zu wissen/erkennen, ob eine Warnung oder Aktion Blatt geöffnet wurden?

Gibt es Benachrichtigungen beim Öffnen oder ein Durchlaufen der Ansichtshierarchie, um es zu erkennen?

Dank

Antwort

17

Sie machen einen Alarm senden, wenn sie sich öffnen, aber nur, um ihre delegate - Check this question für einen schönen Ansatz für dieses Problem. Techzen empfiehlt, ein boolesches Flag auf YES zu setzen, wenn Sie die Warnung öffnen, und es auf NO zurückzusetzen, wenn Sie die Warnung schließen.

EDIT:

Da Sie Zugriff auf alle nicht auf den Code haben, warum nicht dieses klobige Stück Code versuchen:

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

DANK gehen! Ich musste zwei Änderungen an dem Vorschlag vornehmen: (1) Subviews in einem NSArray * und nicht UIView *. (2) Scheint so, als wäre das UIActionSheet nicht die erste [0] Unteransicht, sondern die zweite [1]. Also habe ich die Ansichtshierarchie wiederholt ... Der Code wird als Antwort geschrieben ... – Reuven

+0

Ich habe den anderen Vorschlag von TechZen verwendet, eine Referenz beizubehalten. Ich fand das sehr elegant. –

+1

Wird es auch mit iOS 7 funktionieren? –

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

Hallo ich bin auch mit dem gleichen Problem konfrontiert ich versuchte mit dem obigen Code jedoch, wenn ich versuche, das Array von "windowviews" zu drucken, kein Objekt von uiactionsheet bekommen. Vor diesem ich offen ein actionsheft. Was kann das Problem bitte sein Geben Sie eine Lösung auf diesem – user968597

+0

Ich habe diesen Code nur auf einem iPhone verwendet - kann es sein, dass Sie es auf einem iPad verwenden? – Reuven

+0

funktioniert überhaupt nicht auf ipad. :( – Tarun

2

Sie auch für das Fenster der Ansicht überprüfen Immobilie:

if(actionSheet.window) 
    isBeingPresented = YES; 
1

Danke für die Hilfe, aber seit iOS 6, wird der Code Stück nicht mehr funktionieren. Allerdings habe ich das Problem mit diesem Code behoben. Hoffe, das hilft

2

Detecting Alerts scheint relativ einfach, aber Action Sheets hatte mich ratlos. In iOS 6.1 hatte ich einen Schritt weiter

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

In iOS 7 funktioniert dieser Code für Action-Sheets, aber es funktioniert nicht mehr für Alert-Ansichten. Scheint, dass die beste Lösung für Alert-Ansichten ist, sie zu verfolgen ... 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; 
     } 
} 
Verwandte Themen