Вопрос

Я пишу фрагмент кода, чтобы «сделать что-нибудь->показать предупреждение1->сделать что-нибудь->показать предупреждение2».


    //do something
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"Alert 1" 
                          message:nil 
                          delegate:nil 
                          cancelButtonTitle:@"OK" 
                          otherButtonTitles:nil];
    [alert show];
    [alert release];
    //do something  
    UIAlertView *alert2 = [[UIAlertView alloc] 
                           initWithTitle:@"Alert 2" 
                           message:nil 
                           delegate:nil 
                           cancelButtonTitle:@"OK" 
                           otherButtonTitles:nil];
    [alert2 show];
    [alert2 release];

И вдруг с несколькими AlertViews произошла странная вещь:Он показывает «Предупреждение 1» -> «Предупреждение 2» (нажмите «ОК») -> «Предупреждение 1».Почему «Предупреждение 1» появляется снова?Я еще не написал ни одного метода делегата.Может быть, ошибка? (Благодаря Cobbal предупреждение 1 все еще присутствует, когда появляется предупреждение 2.)

Я считаю, что -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex работает хорошо.Является ли метод делегата распространенным способом отображения нескольких alertViews?

Это было полезно?

Решение

Я предполагаю, что отображается предупреждение 1, а затем закрывается предупреждением 2, поскольку показ не является модальным.Когда оповещение 2 закрыто, оповещение 1 остается открытым.

На ваш второй вопрос, alertView:didDismissWithButtonIndex: может работать лучше, но я на самом деле это не проверял.

Другие советы

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

Оповещение будет оставаться видимым до тех пор, пока оно не будет закрыто либо нажатием кнопки (если таковые имеются, они не требуются), либо вызовом [UIAlertView dismissWithClickedButtonIndex:animated] или (недокументированное) dismiss метод экземпляра оповещения.

Похоже (как предположил Коббал), предупреждение 2 появляется поверх предупреждения 1, вы отклоняете предупреждение 2, а предупреждение 1 остается там (пока оно само не будет закрыто).

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

[править] Возвращаясь к этому и читая снова, мне интересно, о чем вы спрашиваете с помощью метода делегата, следует ли вам показывать предупреждение 2 оттуда?В этом случае, вероятно, это именно то, чего вы хотите – прямо или косвенно.Косвенно я имею в виду, что у вас может быть установлено какое-то состояние где-то еще, которое определяет, должно ли отображаться предупреждение 2 (или обстоятельства, которые к нему приводят).Это состояние (возможно, флаг) может быть установлено, когда вы показываете первое предупреждение, и очищаться, когда предупреждение закрывается (из метода делегата).

Причина, по которой это происходит, заключается в том, что UIAlertView не блокируется во время отображения.Любой код, написанный после отображения предупреждения, будет выполняться сразу после отображения предупреждения.

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

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

Таким образом, вторая часть процесса не произойдет, пока пользователь не нажмет ОК в предупреждении в первой части процесса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top