2010-12-09 46 views
1

Newbie question here. J'aimerais pouvoir spécifier à travers des données (c'est-à-dire un fichier XML), le message Objective-C approprié à envoyer. Un conseil sur si c'est possible ou comment je peux le faire? La meilleure chose suivante, si je ne peux pas faire cela, serait de créer un objet cartographique qui corrélerait une clé (un int) avec une fonction (je suppose aussi un sélecteur). Est-ce possible si ce n'est pas le cas?Comment puis-je nommer une fonction obj-c pour appeler des données XML

Si quelqu'un pouvait me diriger vers un tutoriel ou un exemple de code comme référence, ce serait génial. En ce moment je fais des choses avec une grosse déclaration de changement, et je ne l'aime pas. (J'allume l'identifiant et, dans chaque cas, j'appelle explicitement la méthode correspondant à l'identifiant particulier.)

+0

Sérieusement, je voudrais pouvoir vous upvote deux fois. Une question cohérente et une question que plus de débutants devraient se poser. À votre santé. –

Répondre

1

J'adore que vous ayez posé cette question; trop souvent, je vois Énoncé du commutateur gonflé de Satan. C'est agréable de voir quelqu'un qui veut utiliser une table de fonction à la place.

Si vous êtes d'accord pour utiliser un fichier de liste de propriétés (généralement codé en XML), c'est très simple. Il suffit de créer une liste de propriétés où l'élément racine est un dictionnaire, qui est mappé de certaines clés à certains sélecteurs.

Key    Type   Value 
---------------------------------------------- 
Root    Dictionary 
    firstKey  String  someSelector 
    secondKey  String  anotherSelector 

charge le contenu de votre liste de propriétés dans un NSDictionary:

id path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"plist"]; 
id dict = [NSDictionary dictionaryWithContentsOfFile:path]; 

SEL selector = NSSelectorFromString([dict objectForKey:@"firstKey"]); 
if ([someObject respondsToSelector:selector]) { 
    [someObject performSelector:selector]; 
} 

Bien sûr, vous aurez envie de factoriser cette logique dans une méthode appropriée, et cache probablement la liste des propriétés comme une instance variable.

Note: Personnellement, je pense qu'il est préférable de mettre simplement cette table de fonction en ligne; les listes de propriétés sont cool, mais je ne suis pas sûr que ce soit très utile dans ce cas. De plus, si vous êtes cool avec l'aide Objective-C++, std::map vous permettra de sortir sans emballage et déballer les sélecteurs NSString objets, etc.

+0

objectif-C++ ??? :) – willcodejavaforfood

+0

Objective-C++ est juste Objective-C avec C++ mélangé. –