web-dev-qa-db-fra.com

Plusieurs UIAlertViews pour un délégué

Actuellement, j'ai une classe qui jaillit UIAlertViews ici et là. Actuellement, la même classe est le délégué pour ces derniers (ce serait très logique). Malheureusement, ces UIAlertViews appelleront les mêmes méthodes de délégation de la classe. Maintenant, la question est la suivante: comment savoir de quelle vue d'alerte une méthode de délégation est appelée? Je pensais juste vérifier le titre de la vue d'alerte, mais ce n'est pas si élégant. Quelle est la manière la plus élégante de gérer plusieurs UIAlertViews?

38
quano

Marquez les UIAlertViews comme ceci:

#define kAlertViewOne 1
#define kAlertViewTwo 2

UIAlertView *alertView1 = [[UIAlertView alloc] init...
alertView1.tag = kAlertViewOne;

UIAlertView *alertView2 = [[UIAlertView alloc] init...
alertView2.tag = kAlertViewTwo;

puis différenciez-les dans les méthodes de délégation à l'aide des balises suivantes:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == kAlertViewOne) {
        // ...
    } else if(alertView.tag == kAlertViewTwo) {
        // ...
    }
}
102
Can Berk Güder

Pour votre information, si vous voulez cibler uniquement les utilisateurs d'iOS 4 (ce qui est raisonnable maintenant qu'approximativement 98,5% des clients ont au moins iOS 4 installé ), vous devriez pouvoir utiliser Blocks pour effectuer une gestion en ligne vraiment agréable d'UIAlertViews.

Voici une question de Stackoverflow l'expliquant:
Bloc pour UIAlertViewDelegate

J'ai essayé d'utiliser le framework BlocksKit de Zachary Waldowski pour cela. Son UIAlertView (BlocksKit) API référence avait l'air vraiment bien. Cependant, j'ai essayé de suivre ses instructions pour importer le framework BlocksKit dans mon projet, mais malheureusement, je n'ai pas réussi à le faire fonctionner.

Ainsi, comme peut le suggérer Can Berk Güder, j'ai utilisé les balises UIAlertView pour le moment. Mais à l'avenir, je vais essayer d'utiliser des blocs (de préférence des blocs qui prennent en charge ARC en sortie de boîte)!

4
Dan J

plus facile et plus récent

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 1;

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 2;



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == 1) {
        // first alert...
    } else  {
        // sec alert...
    }
}

terminé!

3
nima sp

Vous pouvez surmonter toute cette épreuve et vous empêcher d'utiliser des balises en améliorant UIAlertView pour qu'il utilise les rappels en bloc. Découvrez cet article de blog j'ai écrit sur le sujet.

1
Stavash

J'ai toujours pensé que l'utilisation de balises était un peu un hack. Si vous les utilisez, définissez au moins des constantes définies pour les numéros de balises.

Au lieu de cela, j'utilise des propriétés comme celle-ci:

Dans la section interface:

@property (nonatomic, weak) UIAlertView *overDueAlertView;
@property (nonatomic, weak) UIAlertView *retryPromptAlertView;

Création de la vue d'alerte:

UIAlertView *alert = [[UIAlertView alloc] init...
self.overDueAlertView = alert;
[alert show];

Méthode déléguée:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  if (alertView == self.overDueAlertView) {
    // Overdue alert
  } else if (alertView == self.retryPromptAlertView) {
    // Retry alert
  }
0
Marcus Adams