2012-08-05 2 views
0

J'ai récemment mis en œuvre: https://github.com/gpambrozio/BlockAlertsAnd-ActionSheetsPersonnalisé UIAlertView pas de rappel de délégué?

J'ai importé tous les fichiers nécessaires dans mon application et compile bien. Maintenant, la question est, comment puis-je faire face au changement de logique?

Alors avant avec UIAlertView d'Apple, je fait quelque chose comme ceci:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Which Key?" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; 
      for (NSMutableDictionary *dict in myArray) { 
       [alertView addButtonWithTitle:[dict objectForKey:@"Key"]]; 
      } 
[alertView show]; 
[alertView release]; 

Ensuite, dans le rappel du alertview je ferais ceci:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    [[Singleton sharedSingleton] setKey:buttonIndex]; 
} 

Maintenant, avec le BlockAlertView il n'y a pas de rappel pour quel bouton a été pressé, comment ils manipulent un bouton presse est de mettre le code que vous voulez exécuter dans le bloc comme je le montre ci-dessous. Quoi qu'il en soit voici comment un BlockAlertView similaire regarderait:

BlockAlertView *alertView = [BlockAlertView alertWithTitle:@"Which Key?" message:nil]; 
      for (NSMutableDictionary *dict in myArray) { 
       [alertView addButtonWithTitle:[dict objectForKey:@"Key"] block:^{ 
        //Not sure what to do here 
       }]; 
      } 
[alertView show]; 

Maintenant, voici ce que je ne sais pas quoi faire, dans ce bloc comment puis-je obtenir ce que je faisais avant avec UIAlertView natif d'Apple? Je ne peux pas accéder à l'index du bouton et je ne peux pas non plus accéder au nom du bouton (ce qui ne serait pas utile dans mon cas puisque j'ai besoin de l'index)

Quoi qu'il en soit, comment dois-je faire ce que je fais? fait avec UIAlertView natif d'Apple, mais avec la logique de BlockAlertView?

Merci!

Edit1 @Christian Pappenberger:

C'est le .h de BlockAlertView et je ne pense pas qu'il y ait un protocole que je peux ajouter à moins que je me trompe. La voici:

@interface BlockAlertView : NSObject { 
@protected 
    UIView *_view; 
    NSMutableArray *_blocks; 
    CGFloat _height; 
} 

+ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message; 

- (id)initWithTitle:(NSString *)title message:(NSString *)message; 

- (void)setDestructiveButtonWithTitle:(NSString *)title block:(void (^)())block; 
- (void)setCancelButtonWithTitle:(NSString *)title block:(void (^)())block; 
- (void)addButtonWithTitle:(NSString *)title block:(void (^)())block; 

- (void)show; 
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated; 

@property (nonatomic, retain) UIImage *backgroundImage; 
@property (nonatomic, readonly) UIView *view; 
@property (nonatomic, readwrite) BOOL vignetteBackground; 

@end 

Répondre

3

Un le bloc est une partie du code qui sera exécutée une fois qu'il est déclenché.

[alertView addButtonWithTitle:[dict objectForKey:@"Key"] block:^{ 
        //Not sure what to do here 
       }]; 

Le code ci-dessus ajoute un bouton à la BlockAlertView et une fois qu'il est pressé, le code qui est dans le bloc il est ce qui va être exécuté. Voici un exemple:

... 

[alertView addButtonWithTitle:@"First Button" block:^{ 
        NSLog(@"First Button Pressed"); 
       }]; 

[alertView addButtonWithTitle:@"Second Button" block:^{ 
        NSLog(@"Second Button Pressed"); 
       }]; 
... 

[alertView show]; 

Une fois que le code est exécuté et le alertView est affiché, deux boutons seront présents dans le alertView, avec des titres « Bouton d'abord » et « Bouton Second ». Lorsque vous cliquez sur chacun des boutons, ce qui se passera, c'est que le code dans le bloc sera exécuté. La console affichera "First Button Pressed" ou "Second Button Pressed" selon le bouton pressé.

Maintenant que vous savez comment fonctionne ce type d'alertViews, je vais vous expliquer ce que vous devez faire dans votre cas.

Comme vous le faites remarquer vous n'obtiendrez pas le buttonIndex, mais vous saurez quel bouton a déclenché le bloc.

Donc, si vous avez besoin maintenant buttonIndex j'ajouterais un int buttonIndex et incrémenter chaque fois que dans le code ci-dessous:

BlockAlertView *alertView = [BlockAlertView alertWithTitle:@"Which Key?" message:nil]; 

    int buttonIndex = 0; // HERE 

    for (NSMutableDictionary *dict in myArray) { 
     [alertView addButtonWithTitle:[dict objectForKey:@"Key"] block:^{ 
       [[Singleton sharedSingleton] setKey:buttonIndex]; // HERE 
      }]; 

    buttonIndex++; // HERE 
        } 

     [alertView show]; 

Si vous avez besoin de plus amples explications de quelque chose d'autre ne hésitez pas à demander.

EDIT explication Ajouté

Le paradigme block diffère avec le paradigme du délégué. Avec le paradigme delegate lorsque le bouton est enfoncé, il appelle la méthode déléguée (clickedButtonAtIndex:) dans le cas UIAlerViewDelegate. Lorsqu'un bloc est exécuté, chaque bloc séparé est déclenché.

est ici la clé:

Lorsque vous utilisez l'approche modulaire chaque bouton possède le code, il exécutera une fois son déclenchement. Dans l'approche déléguée lorsque les boutons sont enfoncés, ils appellent une méthode commune à exécuter.

Ainsi, dans un exemple:

Objectif: sortie à la console des mots différents en fonction de la touche enfoncée.

approche délégué:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Which Key?" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; 

[alertView addButtonWithTitle:"@Button 1"]; 
[alertView addButtonWithTitle:"@Button 2"]; 
[alertView addButtonWithTitle:"@Button 3"]; 

[alertView show]; 

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if(buttonIndex == 0) 
     NSLog(@"Dog"); 
    else if (buttonIndex == 1) 
     NSLog(@"Cat"); 
    else if (buttonIndex == 2) 
     NSLog(@"Shark"); 
} 

Comme vous pouvez le voir, une fois que le bouton est enfoncé, la méthode de délégué est appelé et il y a quand vous décidez en fonction de la buttonIndex ce que la sortie.

approche Bloc:

BlockAlertView *alertView = [BlockAlertView alertWithTitle:@"Which Key?" message:nil]; 

[alertView addButtonWithTitle:@"Button 1" block:^{ 
        NSLog(@"Dog"); 
       }]; 
[alertView addButtonWithTitle:@"Button 2" block:^{ 
        NSLog(@"Cat"); 
       }];   
[alertView addButtonWithTitle:@"Button 3" block:^{ 
        NSLog(@"Shark"); 
       }]; 

[alertView show]; 

Dans ce cas, aucune méthode de délégué est appelé, et le code d'exécution est à l'intérieur de chaque bouton! Vous n'avez donc pas besoin de "vérifier les chaînes de titre de bouton spécifiques et de faire du code en fonction de cela". Vous devez inclure le code qui sera exécuté dans chaque bouton. Je ne sais pas si je suis clair, si vous avez besoin d'explications, n'hésitez pas à demander.

+0

Merci qui a semblé fonctionner. Aussi juste pour que je sache pour l'avenir, comment pourrais-je exécuter certains codes en fonction d'un titre de bouton spécifique mais je ne suis pas sûr de l'index de celui-ci? ex: Dans le clickedButtonAtIndex je peux vérifier les chaînes de titre de bouton spécifiques et faire le code basé sur cela. Je ne suis pas sûr de savoir comment je pourrais dans ce scénario. –

+0

j'ai édité ma réponse afin que je puisse ajouter plus de code – tomidelucca

+0

Désolé, je ne savais pas que je n'étais pas clair en vous posant la question! :/Quoi qu'il en soit, permettez-moi de le reformuler. Disons donc que nous avons un NSArray contenant un NSMutableDictionary. Il y a une clé dans le dictionnaire nommé "Couleur", il y a 4 NSMutableDictionary dans le tableau et dans l'ensemble il y a des couleurs: Bleu, Orange, Rouge, Vert respectivement. Alors j'utilise une boucle for à travers le tableau (comme je le fais avec myArray) où j'ajoute un bouton intitulé NSString dans "Color". Alors maintenant que nous avons ajouté tous les boutons, je veux exécuter un certain code lorsque "Red" est pressé.Avec un UIAlertView je vérifierais en vérifiant le NSString dans –

0

Avez-vous vérifié s'il y a implémentation de protocole?

+0

Vérifier ma modification1 J'ai ajouté le fichier .h du fichier. –

+0

vous avez raison ... mais cette méthode: dismissWithClickedButtonIndex est celle que vous recherchez. Savez-vous comment implémenter un protocole? –

+0

Oui mais ma question a changé maintenant, regardez les 2 derniers commentaires que j'ai faits pour l'autre répondeur. C'est ma dernière question. –

Questions connexes