2 AlertView avec chacune des actions différentes à  effectuer

Ben77650Ben77650 Membre
mai 2015 modifié dans API UIKit #1

Bonjour j'ai 2 UIAlertView dans mon code.


 


Selon l'AlertView l'action a représenter est différente.


 


Je n'ai pas trouvé comment faire vu qu'on ne peut utiliser qu'une instance de alertView clickedButton AtIndex


 


Voila mes 2 AlertView et ce que j'aimerais que chacune d'elle fasse


 


UIAlertview 1



- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@Erreur
message:@Impossible de se connecter au serveur distant, vérifiez que vos données cellulaires sont activées
delegate:self
cancelButtonTitle:@Réglages
otherButtonTitles:@Réesayer, nil];
[alert show];
}

Actions UIAlertView 1



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
if (buttonIndex == 1)
{
[self lancerConnexion];
}
}

UIAlertView2



- (IBAction) appeler:(id)sender {

Variables *objTelAgence = [Variables getTelAgence];
NSString *phoneCallNum = [NSString stringWithFormat:@%@",objTelAgence.telAgence];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:phoneCallNum message:@"" delegate:self cancelButtonTitle:@Annuler otherButtonTitles:@Appeler, nil];
[alert show];
}

Actions UIAlertView 2



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0){
//Supprimer de l'alertView, c'est bien comme ça ?
[alertView removeFromSuperview];
}
else{
[self appelAgence];
}
}

-(void) appelAgence
{
Variables *objTelAgence = [Variables getTelAgence];
NSString *phoneCallNum = [NSString stringWithFormat:@tel://%@",objTelAgence.telAgence];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneCallNum]];
}


Réponses

  • LarmeLarme Membre
    mai 2015 modifié #2

    Solution rapide, utiliser des tags.


    Lors de la création :



    [alert setTag:tagToBeDefined];

    Dans la méthode delegate:



    if ([alertView tag] == alertViewConnectionErrorTag)
    {
    //Do Something
    }
    else if ([alertView tag] == alertViewPhoneCallTag)
    {
    //Do something
    }

  • Merci, c'est normal que le tag soit un Int ? On ne peut pas mettre du texte, comme tu as fait dans le if ?


  • jpimbertjpimbert Membre
    mai 2015 modifié #4

    Tu as défini tes alertes avec un titre spécifique, c'est bien. Et tu peux utiliser le titre ...



    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
    if ([alertView.title isEqualsToString:@Erreur]) {
    if (buttonIndex == 0)
    {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    }
    if (buttonIndex == 1)
    {
    [self lancerConnexion];
    }
    } else if ([alertView.title isEqualsToString:phoneCallNum]) {
    if (buttonIndex == 0){
    //Supprimer de l'alertView, c'est bien comme ça ?
    [alertView removeFromSuperview];
    } else {
    [self appelAgence];
    }
    }
    }
  • CéroceCéroce Membre, Modérateur
    Si tu développes pour iOS 8, préfère UIAlertController, qui utilise des callbacks sous formes de blocs.

    Sinon:
    https://github.com/AliSoftware/OHAlertView
  • Merci jpimbert ça fonctionne bien ;)


  • LarmeLarme Membre


    Merci, c'est normal que le tag soit un Int ? On ne peut pas mettre du texte, comme tu as fait dans le if ?




    Oui.

    Qui a dit que mon alertViewConnectionErrorTag était un NSString ?


    En général, un "==" entre 2 NSString, on évite, car c'est souvent pas ce à  quoi on s'attend.


    Sinon, tu peux très bien avoir un enum avec les 2 tags.

  • FKDEVFKDEV Membre

    Les deux méthodes sont rapides mais beurk B)  .


    Merci le MVC.


    Et j'imagine que si on a besoin d'afficher cette alert view à  plusieurs endroits, on va copier/coller tout ce petit monde dans chaque controller.


     


    Il existe sur github des categories pour utiliser des blocks avec les UIAlertView, c'est déjà  plus propre.


     


    Sinon, de manière générale (donc valable aussi quand tu as deux tableview pour un controller),


    le delegate n'est pas forcément le controller.


    Tu peux créer une classe juste pour répondre aux delegate de toutes tes alert view et la dériver pour chaque alert view.


     


    Tu peux même dériver UIAlertView et en faire son propre delegate si tu n'as pas peur d'écrire :


    alert.delegate = alert.

Connectez-vous ou Inscrivez-vous pour répondre.