Plusieurs UIActionSheets sur le même délégué

J'écris un jeu de puzzle. Lorsque l'user appuie sur le button de vérification, je vois si la solution qu'ils ont input est correcte. Selon le résultat, je présente l'une des deux feuilles d'action pour eux. Pour l'instant, j'ai juste quelques instructions NSLog pour m'assurer que les choses sont appelées, mais seulement une des feuilles semble fonctionner correctement.

Rien n'est appelé lorsque je clique sur un button dans showErrorsActionSheet . La feuille d'action disparaît de l'écran, mais les journaux ne s'impriment jamais.

Je soupçonne que cela a quelque chose à voir avec deux actions déclarées à un même délégué (auto)

- (void) checkSolution { //code determines the value of the BOOL allCorrect if (allCorrect) { //IF ALL OF THE LETTERS WERE CORRECT //display UIAlertView; NSLog(@"allCorrect"); UIActionSheet *levelCompleteActionSheet = [[UIActionSheet alloc] initWithTitle:@"Congratulations! You Have Finished the Level!" delegate:self cancelButtonTitle:@"Review my work" destructiveButtonTitle:@"Choose next puzzle" otherButtonTitles:nil, nil]; [levelCompleteActionSheet showInView:self.view]; [levelCompleteActionSheet release]; } else { //[self showIncorrectLettersInRed]; UIActionSheet *showErrorsActionSheet = [[UIActionSheet alloc] initWithTitle:@"Sorry, thats not right. Show errors in red?" delegate:self cancelButtonTitle:@"No Thanks, I'll keep trying" destructiveButtonTitle:@"Yes please, I'm stuck!" otherButtonTitles:nil, nil]; [showErrorsActionSheet showInView:self.view]; [showErrorsActionSheet release]; } } 

les methods qui sont censées être appelées sont:

 - (void) levelCompleteActionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { if (buttonIndex != [actionSheet cancelButtonIndex]) { NSLog(@"return to levelSelect"); //pushViewController:levelSelect } else { NSLog(@"continue to examine solution"); } } - (void) showErrorsActionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { if (buttonIndex != [actionSheet cancelButtonIndex]) { NSLog(@"show errors in red"); } else { NSLog(@"continue to try"); } } 

et Ive a déclaré le protocole UIActionSheet dans le file d'interface comme suit:

 @interface GamePlay : UIViewController <UIActionSheetDelegate> { 

Définissez une balise pour chaque actionSheet, puis utilisez une instruction switch dans le délégué UIActionSheet.

Atsortingbuer un tag

 - (void)checkSolution { if (allCorrect) { UIActionSheet *levelCompleteActionSheet = [[UIActionSheet alloc] initWithTitle:@"Congratulations! You Have Finished the Level!" delegate:self cancelButtonTitle:@"Review my work" destructiveButtonTitle:@"Choose next puzzle" otherButtonTitles:nil, nil]; [levelCompleteActionSheet setTag: 0]; [levelCompleteActionSheet showInView:self.view]; [levelCompleteActionSheet release]; } else { UIActionSheet *showErrorsActionSheet = [[UIActionSheet alloc] initWithTitle:@"Sorry, thats not right. Show errors in red?" delegate:self cancelButtonTitle:@"No Thanks, I'll keep trying" destructiveButtonTitle:@"Yes please, I'm stuck!" otherButtonTitles:nil, nil]; [showErrorsActionSheet setTag: 1]; [showErrorsActionSheet showInView:self.view]; [showErrorsActionSheet release]; } } 

Délégué UIActionSheet

 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { switch ( actionSheet.tag ) { case 0: /* levelCompleteActionSheet */ { switch ( buttonIndex ) { case 0: /* 1st button*/ break; case 1: /* 2nd button */ break; } } break; case 1: /* showErrorsActionSheet */ break; } } 

La même chose s'appliquerait ailleurs dans cette class, y compris levelCompleteActionSheet: et showErrorsActionSheet: La seule différence est que vous devez créer un iVar pour chaque actionSheet au lieu de les créer dans checkSolution .

Les methods qui seront appelées par une UIActionSheet sur son délégué sont les methods répertoriées dans le protocole UIActionSheetDelegate.

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIModalViewDelegate_Protocol/UIActionSheetDelegate/UIActionSheetDelegate.html

Pour être appelée, votre méthode doit être l'une de ces methods. Je ne vois pas levelCompleteActionSheet ou showErrorsActionSheet dans ce protocole! 🙂 Votre méthode doit être nommée actionSheet:clickedButtonAtIndex: et pas un nom que vous actionSheet:clickedButtonAtIndex: de tissu entier.

Utiliser Tag pour résoudre ce problème

levelCompleteActionSheet.tag = 100;

showErrorsActionSheet.tag = 101;

 - (void) levelCompleteActionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { if(actionSheet.tag == 100){ // levelCompleteActionSheet implement your required function } else if(actionSheet.tag == 101){ // showErrorsActionSheet implement your required function } }