У меня есть метод, который отправляет данные HTTP и отображает UIAlertView, если существует ошибка. Если у меня будет несколько сообщений HTTP, то я покажу несколько UIAlertView для каждой ошибки.
Я хочу показать UIAlertView, только если не показывает другой UIAlertView. Как я могу определить это?
Для объекта, который вызывает set ivar перед вызовом метода show в вашем UIAlertView.
...
if (!self.alertShowing) {
theAlert = [[UIAlertView alloc] initWithTitle:title message:details delegate:self cancelButtonTitle:nil otherButtonTitles:@"Okay", nil];
self.alertShowing = YES;
[theAlert show];
}
...
Затем в вашем методе делегирования для управления предупреждениями установите для вашего флага ivar значение no:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
...
self.alertShowing = NO;
}
Если вы хотите, чтобы предупреждения отображались последовательно, я бы отправил уведомления, чтобы добавить каждое сообщение в очередь, а затем только забрать сообщение из очередь после закрытия предупреждения.
Если вы можете управлять другими видами предупреждений, проверьте свойство visible
для каждого из них.
В iOS 6 или ранее при появлении предупреждения оно перемещается в _UIAlertOverlayWindow. Поэтому довольно хрупкий метод - перебрать все окна и проверить, есть ли какие-либо подвиды UIAlertView.
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.