iPhone: detecting if a UIAlert/UIActionSheet are open
Solution 1
They do send an alert when they open, but only to their delegate
-- Check this question for a nice approach to that problem. Techzen recommends setting a boolean flag to YES
when you open up the alert, and setting it back to NO
when you dismiss the alert.
EDIT:
Since you don't have access at all to the code, why not try this clunky piece of 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;
}
Solution 2
- (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;
}
Solution 3
You can also check for the view's window property:
if(actionSheet.window)
isBeingPresented = YES;
Solution 4
Detecting alerts seems relatively easy, but action sheets had me stumped. In iOS 6.1 I had to go one step further
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;
}
Solution 5
thanx for the help, but since iOS 6, the code piece doesn't work anymore. However, I fixed the issue with this code. Hope this helps
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;
Reuven
Updated on June 15, 2022Comments
-
Reuven about 2 years
In my iOS application, I have a timer firing up, and when it fires, I need to be able to detect whether there's an Alert (UIAlertView) or an Action Sheet (UIActionSheet) open.
One way would be to modify the code presenting the alerts/actionsheets - but unfortunately this is not an option in my case.
So, the question is - is there a way of knowing/detecting whether an alert or action sheet have been opened?
Is there any notifications sent upon opening, or any traversal of the view hierarchy to detect it?
Thanks
-
Reuven over 13 yearsTHANKS! I had to apply two changes to the proposal: (1) subviews in an NSArray* and not UIView*. (2) Seems like the UIActionSheet is not the first [0] subview, but the second [1]. So I iterated the view hierarchy... Code is posted as answer...
-
Keith at Ideal Films over 12 yearsI used TechZen's other suggestion of retaining a reference. I found this worked very elegantly.
-
user968597 about 12 yearshello i am also facing same problem i tried with the above code however when i try to print the array of "window.subviews" , not getting any object of uiactionsheet .Before this i kept open one actionsheet .what can be the problem please give some solution on this
-
Reuven about 12 yearsI've only used this code on an iPhone - can it be you're using it on an iPad?
-
Tarun over 11 yearsNot Working at all on ipad. :(
-
Jeff Mascia over 10 yearsIn iOS 7 this code works for action sheets, but it no longer works for alert views. Seems like the best solution for alert views is to keep track of them... stackoverflow.com/q/18702565/268153