iPhone: обнаружение, открыт ли UIAlert/UIActionSheet
В моем приложении iOS у меня срабатывает таймер, и когда он срабатывает, мне нужно уметь обнаруживать, открыты ли Alert (UIAlertView) или Action Sheet (UIActionSheet).
Одним из способов может быть изменение кода, представляющего предупреждения / таблицы действий, но, к сожалению, в моем случае это не вариант.
Итак, вопрос в том, есть ли способ узнать / обнаружить, были ли открыты лист предупреждения или действия?
Есть ли какие-либо уведомления, отправленные при открытии, или какой-либо обход иерархии представления для его обнаружения?
Спасибо
6 ответов
Они отправляют оповещение, когда они открывают, но только для своих delegate
- Проверьте этот вопрос для хорошего подхода к этой проблеме. Techzen рекомендует установить логический флаг YES
когда вы открываете предупреждение и возвращаете его NO
когда вы отклоните предупреждение.
РЕДАКТИРОВАТЬ:
Поскольку у вас совсем нет доступа к коду, почему бы не попробовать этот неуклюжий кусок кода:
-(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;
}
- (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;
}
Вы также можете проверить свойство окна представления:
if(actionSheet.window)
isBeingPresented = YES;
Обнаружение предупреждений кажется относительно простым, но листы с действиями поставили меня в тупик. В 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;
}
-(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;
}
}
Спасибо за помощь, но начиная с 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;