[Résolu] Stockage de SELectors dans un NSDictionary
Bloodshed
Membre
Bonjour,
Dans le cadre de mon application, je dois stocker des selectors dans un NSDictionary, afin de pouvoir les rappeler plus tard. Le probleme etant que le NSDictionary n'accepte que des objets, et SEL semble etre un type primitif. Du coup je ne sais pas comment stocker ce selector. Une idee ?
Afin d'illustrer mon probleme, voici un exemple simplifie de ce que je souhaites faire :
Actuellement je triche en stockant le nom de la methode liée au selecteur sous forme de NSString*, puis en creeant le selecteur avec NSSelectorFromString()
Mais ce n'est pas très élégant, ni dans l'esprit de l'Objective-C, aussi connaissez-vous un moyen de stocker ces selectors (ou du moins de transformer un selector sous forme de NSString* le temps du stockage) ?
Dans le cadre de mon application, je dois stocker des selectors dans un NSDictionary, afin de pouvoir les rappeler plus tard. Le probleme etant que le NSDictionary n'accepte que des objets, et SEL semble etre un type primitif. Du coup je ne sais pas comment stocker ce selector. Une idee ?
Afin d'illustrer mon probleme, voici un exemple simplifie de ce que je souhaites faire :
<br />@synthesize selectors; // variable d'instance de type NSMutableDictionary contenant les selectors<br /><br />- (void)addSelector:(SEL)aSelector forIdentifier:(NSString*)anIdentifier<br />{<br /> // Ca ne marche pas car le dictionary n'accepte que des objets:<br /> [selectors setObject:aSelector forKey:anIdentifier];<br />}<br /><br />- (void)callSelectorForIdentifier:(NSString*)anIdentifier<br />{<br /> [self performSelector:[selectors objectForKey:anIdentifier]];<br />}<br />
Actuellement je triche en stockant le nom de la methode liée au selecteur sous forme de NSString*, puis en creeant le selecteur avec NSSelectorFromString()
<br />@synthesize selectors; // variable d'instance de type NSMutableDictionary contenant les selectors<br /><br />- (void)addSelector:(NSString*)aSelector forIdentifier:(NSString*)anIdentifier<br />{<br /> // Ca marche car aSelector est une NSString<br /> [selectors setObject:aSelector forKey:anIdentifier];<br />}<br /><br />- (void)callSelectorForIdentifier:(NSString*)anIdentifier<br />{<br /> // On recréé le selector avec la NSString:<br /> SEL aSelector = NSSelectorFromString([selectors objectForKey:anIdentifier]);<br /> [self performSelector:aSelector];<br />}<br />
Mais ce n'est pas très élégant, ni dans l'esprit de l'Objective-C, aussi connaissez-vous un moyen de stocker ces selectors (ou du moins de transformer un selector sous forme de NSString* le temps du stockage) ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pourquoi trouves-tu ça inélégant ? C'est plutôt conforme à l'encapsulation en Objective-C...
Cela dit, je me suis demandé si NSValue pouvait convenir, et j'ai trouvé une réponse (que je n'ai pas essayée) :
http://www.cocoabuilder.com/archive/message/cocoa/2006/12/6/175554
Si ça marche, tant mieux, sinon les NSStringFromSelector ne me choquent pas.
+
Chacha
Fonctionne
Sinon, NSStringFromSelector/NSSelectorFromString fonctionne aussi...
Ce n'est pas le fait de stocker des strings qui me gene, mais plutot de demander une NSString* en tant qu'argument d'une methode qui, semantiquement, veut en fait des selectors.
Ah mais c'est que je ne savais pas que la fonction NSStringFromSelector() existait aussi ! J'ai pourtant fait une recherche mais dans l'aide Apple il n'y avait que la fonction NSSelectorFromString(). Je vais utiliser ca !
Merci a tous !
Ah ok, j'avais pas vu que tu n'utilisais que NSSelectorFromString !
ça me fait penser que j'avais mis très longtemps à "découvrir" Foundation/Foundation.h. Ce header comporte beaucoup de fonctions utilitaires extrêmement utiles. Mais comme ce ne sont pas des méthodes, on tombe rarement dessus en explorant la doc de Cocoa en passant de classe en classe.