iPhone: определение того, открыты ли UIAlert / UIActionSheet

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

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

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

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

Спасибо


person Reuven    schedule 06.12.2010    source источник


Ответы (5)


Они отправляют предупреждение при открытии, но только своему 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;
}
person Sam Ritchie    schedule 06.12.2010
comment
БЛАГОДАРНОСТЬ! Мне пришлось применить два изменения к предложению: (1) подпредставления в массиве NSArray *, а не в UIView *. (2) Похоже, что UIActionSheet - это не первое [0] подпредставление, а второе [1]. Итак, я повторил иерархию представлений ... Код размещен как ответ ... - person Reuven; 06.12.2010
comment
Я воспользовался другим предложением TechZen о сохранении ссылки. Я обнаружил, что это работает очень элегантно. - person Keith at Ideal Films; 21.02.2012

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

if(actionSheet.window)
    isBeingPresented = YES;
person Peter DeWeese    schedule 29.08.2011

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

}

person user2002649    schedule 18.03.2013
comment
В iOS 7 этот код работает для листов действий, но больше не работает для представлений предупреждений. Похоже, лучшее решение для представлений предупреждений - отслеживать их ... stackoverflow.com/q/18702565/268153 - person Jeff Mascia; 19.11.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;
person SlumTheSlug    schedule 19.02.2013

person    schedule
comment
привет, я также столкнулся с той же проблемой, что и с приведенным выше кодом, однако, когда я пытаюсь распечатать массив window.subviews, не получая никакого объекта uiactionsheet. До этого я оставил открытым один лист действий. в чем может быть проблема, пожалуйста, дайте какое-то решение на этом - person user968597; 08.06.2012
comment
Я использовал этот код только на iPhone - может быть, вы используете его на iPad? - person Reuven; 10.06.2012
comment
Не работает вообще на ipad. :( - person Tarun; 01.03.2013