iPhone: обнаружение, открыт ли UIAlert / UIActionSheet - PullRequest
10 голосов
/ 06 декабря 2010

В моем приложении для iOS у меня срабатывает таймер, и когда он срабатывает, я должен быть в состоянии определить, открыто ли предупреждение (UIAlertView) или лист действий (UIActionSheet).

Oneможно было бы изменить код, представляющий предупреждения / листы действий, - но, к сожалению, в моем случае это не вариант.

Итак, вопрос в том, есть ли способ узнать / определить, есть ли предупреждение или лист действийбыли открыты?

Есть ли какие-либо уведомления, отправленные при открытии, или какой-либо обход иерархии представления для его обнаружения?

Спасибо

Ответы [ 6 ]

17 голосов
/ 06 декабря 2010

Они отправляют оповещение при открытии, но только на delegate - отметьте этот вопрос , чтобы найти хороший подход к этой проблеме. Techzen рекомендует установить логический флаг на 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;
}
12 голосов
/ 06 декабря 2010
- (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;
}
2 голосов
/ 18 марта 2013

Обнаружение предупреждений кажется относительно легким, но листы действий поставили меня в тупик.В 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;

}

2 голосов
/ 29 августа 2011

Вы также можете проверить свойство окна представления:

if(actionSheet.window)
    isBeingPresented = YES;
1 голос
/ 09 марта 2015
-(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;
        } 
}
1 голос
/ 19 февраля 2013

спасибо за помощь, но начиная с 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;
...