2008-11-24 8 views
7

J'ai deux UIActionSheets et je pense que je vais les contrôler avec un délégué (le UIViewController qui les instancie). Le délégué va capturer un appel actionSheet et essayer de déterminer lequel des deux a lancé l'événement.Utiliser un délégué pour gérer deux UIActionSheets

J'ai essayé d'obtenir le titre de la modalView pour différencier, mais il semble être invalide ...

ce travail devrait?

Sinon, existe-t-il un autre moyen de distinguer quelle UIActionSheet a fait l'événement?

Ou ai-je besoin de créer deux classes différentes qui seront des délégués distincts pour chaque UIActionSheet?

Merci d'avance.

Répondre

44

Je pense que vous avez besoin de la propriété tag de la UIActionSheet.

Quelque chose comme:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle ... ]; 
actionSheet.tag = 10; 
[actionSheet showInView:self.view]; 

Puis dans votre délégué:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    switch (actionSheet.tag) { 
    case 10: 
     ... 
    } 
} 

tag est une propriété de UIView et peut être définie dans Interface Builder pour les composants qui apparaissent là aussi. Très pratique, même si je ne l'ai jamais utilisé dans ce contexte moi-même.

+1

Stephen m'a battu au coup de poing. C'est exactement la technique que j'utilise. La propriété tag est très pratique pour les cas comme celui-ci. Je l'utilise également lorsque je génère dynamiquement des interfaces utilisateur où le nombre de sous-vues est déterminé au moment de l'exécution. – Jablair

+0

Excellent, cela a très bien fonctionné. Merci! –

+0

"tag" est une astuce fantastique - magnifique. – Fattie

9

Les méthodes Delegate dans Cocoa incluent l'objet d'envoi à cet effet. Conservez une référence à chacune de vos feuilles d'action en tant que variable d'instance dans votre classe de contrôleur et vous pouvez la comparer au paramètre actionSheet de vos méthodes déléguées pour déterminer les actions à effectuer. L'utilisation de la propriété tag de la vue fonctionnerait, mais il serait plus facile de conserver une référence. La propriété tag est conçue pour vous aider à trouver une vue si vous regardez dans une hiérarchie de sous-vues et que vous n'avez pas de référence à l'objet dont vous avez besoin.

6

Vous devez utiliser le pointeur de feuille d'action transmis à la méthode du délégué comme l'a dit Marc. Par exemple:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if(actionSheet == myDoSomethingActionSheet) { 
     if(buttonIndex == 0) { 
      [self doThingA]; 
      return; 
     } 
     if(buttonIndex == 1) { 
      [self doThingB]; 
      return; 
     } 
    } 
    if(actionSheet == myOtherActionSheet) { 
     if(buttonIndex == 3) { 
      [self doImportantThing]; 
      return; 
     } 
    } 
} 
Questions connexes