Bug em AlertView no iPhone?
-
20-08-2019 - |
Pergunta
eu escrever um pedaço de código para "fazer alguma coisa-> mostrar alert1-> do algo-> Mostrar alert2".
//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];
E de repente aconteceu uma coisa estranha para vários AlertViews: Mostra "Alerta 1" -> "Alerta 2" (Pressione 'OK') -> "Alerta 1". Por mostra "Alerta 1" de novo? Não tenho escrito qualquer método delegado ainda. Talvez um bug? (Graças a cobbal, alert1 ainda está lá quando alert2 aparece.)
Eu acho - (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex funciona bem. É o método delegado uma forma comum de mostrar várias alertViews?
Solução
Eu diria que alerta 1 é mostrado e, em seguida, coberto por alerta 2 desde show não é modal. Quando em alerta 2 está fechada, alerta 1 ainda está aberta.
Para sua segunda pergunta, alertView:didDismissWithButtonIndex:
pode funcionar melhor, mas eu realmente não tenho testado isso.
Outras dicas
O delegado é para que você possa ser notificado quando o alerta é rejeitado, e qual botão foi usado para descartá-lo. Ele não afeta se o alerta é rejeitado em tudo.
O alerta permanecerá visível até que ele é rejeitado tanto por você tocar num botão. (Se houver - eles não são obrigados) ou você chamar qualquer [UIAlertView dismissWithClickedButtonIndex:animated]
ou o (indocumentados) Método dismiss
da instância de alerta ??p>
Parece que (como Cobbal sugerido), alerta 2 está aparecendo ao longo de alerta 1, você descartar alerta 2, e alerta 1 permanece lá (até que em si é rejeitado).
Existe uma razão particular que pretende mostrar um novo alerta, enquanto outro ainda está mostrando? Talvez mais algum contexto nos ajudaria a chegar à raiz do problema, que eu suspeito que pode ser um problema de design.
[editar] voltar a este e ler de novo, eu me pergunto se o que você está perguntando sobre o método delegado é se você deve estar mostrando alerta 2 a partir daí? No caso em que isso é provavelmente o que você quer - seja direta ou indiretamente. Por indiretamente quero dizer que você pode ter algum outro lugar do estado conjunto que determina se alerta 2 deve ser apresentada (ou as circunstâncias que levam a ele). Esse estado (a bandeira, talvez) poderia ser definida quando você mostra o primeiro alerta, e apagado quando o alerta é rejeitado (a partir do método delegado).
A razão isso acontece é porque UIAlertView não bloqueia enquanto ele está mostrando. Qualquer código escrito depois de mostrar um alertview vai correr em linha reta após o alerta é mostrado.
O que você deve ter é dois métodos diferentes. Um que faz alguma coisa e, em seguida, mostra um alerta, e depois outro que faz algo e mostra outro alerta.
lançar o primeiro método para fazer alguma coisa e mostrar um alerta, em seguida, ligar para método delegado do alerta, e quando você começa a chamada de retorno do alertview, execute o outro método.
Desta forma, a segunda parte do processo não vai acontecer até que o usuário tenha pressionado OK no alerta na primeira parte do processo.