2009-03-19 6 views
0

J'écris un morceau de code pour "faire quelque chose-> montrer l'alerte1-> faire quelque chose-> montrer l'alerte2".Bug dans AlertView sur iPhone?


    //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]; 

Et soudain une chose étrange est arrivé à plusieurs AlertViews: Il affiche "alerte 1" -> "Alerte 2" (Appuyez sur 'OK') -> "Alerte 1". Pourquoi "Alerte 1" s'affiche à nouveau? Je n'ai encore écrit aucune méthode de délégué. Peut-être un bug? (Merci à cobbal, alert1 est toujours là quand alert2 apparaît.)

Je trouve - (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex fonctionne bien. La méthode delegate est-elle un moyen courant d'afficher plusieurs alertViews?

Répondre

2

Je suppose que l'alerte 1 est affichée, puis couverte par l'alerte 2, car l'affichage n'est pas modal. Lorsque l'alerte 2 est fermée, l'alerte 1 est toujours ouverte.

Pour votre deuxième question, alertView:didDismissWithButtonIndex: peut fonctionner mieux, mais je n'ai pas réellement testé cela. Le délégué est pour que vous puissiez être averti lorsque l'alerte est rejetée, et quel bouton a été utilisé pour le fermer.

+0

Merci. Le bouton d'annulation dans alert1 est bloqué lorsque alert2 s'affiche. Cela ne me donne pas le temps de cliquer dessus. La méthode déléguée est-elle toujours utilisée pour afficher plusieurs vues d'alerte? –

+0

Je ne vois pas d'autre moyen de le faire au moins – cobbal

+0

Il y a une méthode pour provoquer UIAlertView à montrer modalement, mais c'est une méthode privée – rpetrich

0

Cela n'a aucune incidence sur le rejet de l'alerte. L'alerte restera visible jusqu'à ce qu'elle soit fermée en appuyant sur un bouton (le cas échéant - ils ne sont pas requis) ou que vous appeliez [UIAlertView dismissWithClickedButtonIndex:animated] ou la méthode (non documentée) dismiss de l'instance d'alerte. Il semble que (comme suggéré par Cobbal), l'alerte 2 apparaisse au-dessus de l'alerte 1, vous rejetez l'alerte 2 et l'alerte 1 reste là (jusqu'à ce qu'elle soit elle-même ignorée).

Y a-t-il une raison particulière pour laquelle vous souhaitez afficher une nouvelle alerte alors qu'une autre est toujours affichée? Peut-être que plus de contexte nous aiderait à aller au fond du problème, ce qui pourrait être un problème de conception. [Edit] Pour revenir à ceci et relire, je me demande si ce que vous demandez à propos de la méthode déléguée est de savoir si vous devriez montrer l'alerte 2 à partir de là? Dans ce cas, c'est probablement ce que vous voulez, directement ou indirectement. Par indirectement, je veux dire que vous pouvez avoir un état défini ailleurs qui détermine si l'alerte 2 doit être affichée (ou les circonstances qui y conduisent). Cet état (un indicateur, peut-être) peut être défini lorsque vous affichez la première alerte, et effacé lorsque l'alerte est rejetée (à partir de la méthode déléguée).

0

La raison pour laquelle cela se produit est que UIAlertView ne bloque pas pendant son affichage. Tout code écrit après l'affichage d'un alertview sera exécuté immédiatement après l'affichage de l'alerte.

Vous devriez avoir deux méthodes différentes. Celui qui fait quelque chose et montre ensuite une alerte, puis une autre qui fait quelque chose et montre une autre alerte.

Déclenchez la première méthode pour faire quelque chose et afficher une alerte, puis connectez-vous à la méthode déléguée de l'alerte et, lorsque vous recevez le rappel de alertview, exécutez l'autre méthode. De cette façon, la deuxième partie du processus ne se produira pas tant que l'utilisateur n'aura pas appuyé sur OK sur l'alerte dans la première partie du processus.