IPhone: обнаружение открытия UIAlert/UIActionSheet
В моем приложении iOS у меня включен таймер, и когда он срабатывает, мне нужно выяснить, открываются ли Alert (UIAlertView) или лист действий (UIActionSheet).
Один из способов - изменить код, отображающий предупреждения/таблицы действий, но, к сожалению, это не вариант в моем случае.
Итак, возникает вопрос: существует ли способ узнать/определить, было ли открыто предупреждение или лист действий?
Есть ли какие-либо уведомления, отправленные при открытии, или любой обход иерархии представлений для его обнаружения?
Спасибо
Ответы
Ответ 1
Они посылают предупреждение, когда они открывают, но только к их delegate
- Проверить этот вопрос для приятного подхода к этой проблеме. Techzen рекомендует устанавливать флаг boolean на YES
, когда вы открываете предупреждение, и устанавливаете его обратно на NO
при отключении предупреждения.
EDIT:
Поскольку у вас вообще нет доступа к коду, почему бы не попробовать этот неуклюжий кусок кода:
-(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
- (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;
}
Ответ 3
Вы также можете проверить свойство окна просмотра:
if(actionSheet.window)
isBeingPresented = YES;
Ответ 4
Обнаружение оповещений кажется относительно легким, но листы действий меня насторожили. В iOS 6.1 мне пришлось идти еще на один шаг
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;
}
Ответ 5
thanx для справки, но с iOS 6 фрагмент кода больше не работает.
Однако я исправил проблему с помощью этого кода. Надеюсь, что это поможет
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;
Ответ 6
-(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;
}
}