Как предотвратить складывание нескольких UIAlertView? - PullRequest
8 голосов
/ 18 августа 2011

Я использую MPMoviePlayerController в iOS. Я слушаю любые ошибки, которые могут возникнуть при воспроизведении видео. В моих обработчиках ошибок я выскакиваю UIAlertView . Иногда ошибки могут возникать в быстрой последовательности друг друга, и, таким образом, несколько блоков предупреждений будут накапливаться. Для удобства пользователей я не хочу отображать другое предупреждение, если более раннее по-прежнему отображается.

Ответы [ 6 ]

6 голосов
/ 18 августа 2011

Попробуйте это:

Установите логическое значение на true, когда вы открываете предупреждение, установите его на false, когда вы закрываете предупреждение, и всегда проверяйте логическое значение, чтобы узнать, действительно ли это true, прежде чем вы всплывете событие. Если это true, вы будете знать, что у вас уже есть окно предупреждения.

Вы можете найти это решение и некоторые другие обсуждения здесь .

1 голос
/ 19 августа 2014

Когда появится предупреждение, оно будет перемещено в окно _UIAlertOverlayWindow. Поэтому довольно хрупкий метод состоит в том, чтобы перебрать все окна и проверить, есть ли какие-либо подпредставления UIAlertView.

-(BOOL)checkAlertViewVisibleStatus
{
  for (UIWindow* window in [UIApplication sharedApplication].windows) 
   {
     NSArray* subviews = window.subviews;
      if ([subviews count] > 0)
        if ([[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]])
          return YES;
    }
return NO;
}

Это недокументировано, так как это зависит от внутренней иерархии представлений, хотя Apple не может пожаловаться на это. Более надежный, но еще более недокументированный метод - проверить, является ли `

[_ UIAlertManager visibleAlert]

`равно нулю.

Эти методы не могут проверить, отображается ли UIAlertView из SpringBoard.

1 голос
/ 18 августа 2011

Вы можете реализовать это самостоятельно тривиально. Поскольку вы отображаете предупреждение, а также являетесь его делегатом, чтобы знать, когда оно исчезло, вы можете легко отследить, видимо ли предупреждение, просто установив логический флаг при отображении и скрытии предупреждений. Таким образом, если логическое значение установлено, вы можете отменить любые последующие предупреждения.

0 голосов
/ 25 августа 2016

Должно работать:

-(BOOL) doesAlertViewExist 
{
    if ([[UIApplication sharedApplication].keyWindow isMemberOfClass:[UIWindow class]])
    {
        return NO;//AlertView does not exist on current window
    }
    return YES;//AlertView exist on current window
}
0 голосов
/ 29 августа 2015

Используйте новый UIAlertViewController.Если вы пытаетесь подать предупреждение, когда другое лицо находится в поле зрения, оно игнорирует его и выводит предупреждение, показанное ниже.Это неприятный побочный эффект для людей, которые хотят традиционного поведения сложенных оповещений, но для вашего случая это хорошее решение.

Warning: Attempt to present <UIAlertController: 0x7f9ef34c17e0>  on <MasterViewController: 0x7f9ef344ec90> which is already presenting (null)
0 голосов
/ 18 августа 2011

Насколько я знаю, единственный способ - отслеживать, отображается или нет предупреждение в данный момент и / или оно в настоящее время отклоняется в вашем приложении.Попробуйте отобразить предупреждение в appDelegate, а затем использовать уведомление для уведомления appDelegate при каждом закрытии предупреждения.Таким образом appDelegate отслеживает, есть ли предупреждение с переменной логического флага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...