Je veux créer de manière programmative un dictionnaire qui nourrit les données dans mon UitailView, mais je passe beaucoup de temps avec elle. Je veux créer un dictionnaire qui ressemble à Cette liste de propriétés (image) donne ou prend quelques articles.
J'ai regardé " Liste de propriétés Guide de programmation: Création de listes de propriétés Programmatiquement " et j'ai proposé un petit échantillon de mien: P>
//keys NSArray *Childs = [NSArray arrayWithObjects:@"testerbet", nil]; NSArray *Children = [NSArray arrayWithObjects:@"Children", nil]; NSArray *Keys = [NSArray arrayWithObjects:@"Rows", nil]; NSArray *Title = [NSArray arrayWithObjects:@"Title", nil]; //strings NSString *Titles = @"mmm training"; //dictionary NSDictionary *item1 = [NSDictionary dictionaryWithObject:Childs, Titles forKey:Children , Title]; NSDictionary *item2 = [NSDictionary dictionaryWithObject:Childs, Titles forKey:Children , Title]; NSDictionary *item3 = [NSDictionary dictionaryWithObject:Childs, Titles forKey:Children , Title]; NSArray *Rows = [NSArray arrayWithObjects: item1, item2, item3, nil]; NSDictionary *Root = [NSDictionary dictionaryWithObject:Rows forKey:Keys]; // NSDictionary *tempDict = [[NSDictionary alloc] //initWithContentsOfFile:DataPath]; NSDictionary *tempDict = [[NSDictionary alloc] initWithDictionary: Root];
4 Réponses :
NSMutableDictionary *topLevel = [NSMutableDictionary dictionary]; NSMutableDictionary *item1 = [NSMutableDictionary dictionary]; NSString *item1title = [NSString stringWithString:@"Title 1"]; NSMutableDictionary *item1children = [NSMutableDictionary dictionary]; // create children NSString *item1child1 = [NSString stringWithString:@"item 1, child 1"]; NSMutableDictionary *item1child2 = [NSMutableDictionary dictionary]; NSString *item1child2title = [NSString stringWithString:@"Title 1-2"]; NSMutableDictionary *item1child2children = [NSMutableDictionary dictionary]; NSString *item1child2child1 = [NSString stringWithString:@"item 1, child 2, child 1"]; NSString *item1child2child2 = [NSString stringWithString:@"item 1, child 2, child 2"]; [item1child2 setObject:item1child2title forKey:@"Title"]; [item1child2children setObject:item1child2child1 forKey:@"item 1 child2 child 1"]; [item1child2children setObject:item1child2child2 forKey:@"item 1 child2 child 2"]; [item1child2 setObject:item1child2children forKey:@"children"]; // add children to dictionary [item1children setObject:item1child1 forKey:@"item1 child1"]; [item1children setObject:item1child2 forKey:@"item1 child2"]; // add to item 1 dict [item1 setObject:item1title forKey:@"Title"]; [item1 setObject:item1children forKey:@"children"]; NSMutableDictionary *item2 = [NSMutableDictionary dictionary]; NSString *item2title = [NSString stringWithString:@"Title"]; NSMutableDictionary *item2children = [NSMutableDictionary dictionary]; NSString *item2child1 = [NSString stringWithString:@"item 2, child 1"]; NSString *item2child2 = [NSString stringWithString:@"item 2, child 2"]; NSString *item2child3 = [NSString stringWithString:@"item 2, child 3"]; // add children to dictionary [item2children setObject:item2child1 forKey:@"item2 child1"]; [item2children setObject:item2child2 forKey:@"item2 child2"]; [item2children setObject:item2child3 forKey:@"item2 child3"]; // add to item 2 dict [item2 setObject:item2title forKey:@"Title"]; [item2 setObject:item2children forKey:@"children"]; [topLevel setObject:item1 forKey:@"Item 1"]; [topLevel setObject:item2 forKey:@"Item 2"];
Merci mec! ... Je vais vérifier et essayer de jouer avec elle un peu voir si je reçois ces trucs de dictionnaire de droite;) j'ai aussi remarqué que vous n'avez utilisé aucun tableau (j'ai vu les enfants par exemple dans le lien photo et l'exemple d'application), j'espère que cela fonctionne toujours;) même si cela n'a pas que vous avez ma gratitude. encore une fois thnx ..
C'est une situation où "apprendre à un homme à pêcher" est une approche très utile que "donner un homme un poisson". Une fois que vous comprenez les principes de base et l'API NSDictionary, il devient beaucoup plus facile d'élaborer votre propre solution personnalisée. Voici quelques observations et points d'apprentissage:
+ DICTIONNAIRYWITHOBJECT: FORKEY: CODE>
est utilisé pour créer un NSDictionary avec une seule paire de valeurs de clé. Il n'acceptera pas les arguments séparés par des virgules après chaque côlon (:) dans l'appel de la méthode, juste un. Pour créer un dictionnaire avec plusieurs paires de la valeur de clé, utilisez l'une des 2 méthodes associées: + dictionnairewithObjects: homologues: code>
qui accepte deux objets Nsarray contenant des valeurs et des clés, ou < Un href = "http://developer.apple.com/documentation/cocoa/reference/foundation/classes/nsdictionary_class/reference/reference.html#//apple_ref/ocr/clm/nsdictionary/dictionarywithObjectSandkeys:" rel = "noreferrer" > + DictionnaireWithObjectSandkeys: code> qui alternent (objet, clé, objet, clé) avec une terminaison nil code> argument. LI>
- simplifie le code de création. Vous n'avez pas besoin de million de variables locales pour créer la chose. Utilisez des arguments en ligne où cela a du sens. Une façon de le faire pour accumuler votre dictionnaire dans le code comme un , puis (si nécessaire) apporter une copie immuable en appelant
-Copy code>
dessus. (N'oubliez pas qu'une méthode de copie renvoie un nouvel objet que vous devez relâcher pour éviter les fuites de mémoire.) De cette façon, vous n'avez pas besoin d'avoir une variable pour chaque valeur afin que vous puissiez créer une création de "un tir" de la structure (S ) à chaque niveau. li>
- Utilisez
+ ArraywithObject: code>
pour créer un NSARRAY avec un seul objet. LI>
- (Suggestions de style) N'utilisez jamais une lettre majuscule pour commencer le nom d'une variable, d'une méthode ou d'une fonction. (Notez que cela met en évidence des variables de capsules de premier plan comme des noms de classe.) Cela aidera certainement les autres qui lisent votre code d'être confus à propos de votre intention de votre schéma de dénomination. LI>
ul>
Juste pour vous donner une saveur de ce que la création du dictionnaire dans l'image liée pourrait ressembler au code ... (j'ignore les noms de vos variables choisis et en utilisant les deux approches différentes de l'exhaustivité.) p> xxx pré> p>
premier de .. super! Merci .. J'apprécie vraiment l'explication et l'extrait de code. Depuis que vous m'avez donné une si bonne explication, j'espère que cela ne vous dérange pas que je me pose un couple de plusieurs questions.
Tout d'abord, j'ai fait comme vous l'avez suggéré et c'est ce que j'ai proposé: (J'ai utilisé ma liste de propriétés d'origine au lieu de l'exemple de cette fois, c'est là que la table d'exploration obtient son (ou doit obtenir son) treilleucture). P>
http://img509.imageshack.us/img509/7523/picture2lsg.png p> a également fait des recherches et a essayé autre chose avec une autre entrée. P> NSDictionary *item1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Screen J",[NSNumber numberWithInt:3],nil]
forKeys:[NSArray arrayWithObjects:@"Title",@"View",nil]];
Si vous essayez de poser une question distincte, il serait préférable de poster une nouvelle question afin qu'elle soit de la visibilité et des réponses.
Je ne suis pas sûr de comprendre l'objectif de base ici.
Cela semble à l'exécution, vous construisez un dictionnaire profond avec de nombreux nœuds d'enfants. Mais vous construisez tout cela avec du code statique ... Pourquoi ne pouvez-vous pas simplement faire un plis (comme celui que vous avez eu une image de) et lisez cela dans un NSDictionary? Nsdictionary et Nsarray ont des méthodes qui vous permettent de lire simplement dans un fichier et d'obtenir un objet rempli entier. Ensuite, il est bien plus facile de modifier et de comprendre. Cette méthode est Si toutes les données sont vraiment créées au moment de l'exécution avant de se mettre dans le dictionnaire, il semble que vous voudriez que vous voudriez un très différent, recruteux, Style de code plutôt que les exemples plats donnés. P> Enfin, je n'aime personnellement pas le dictionnaire dictionnairewithcontentsOffile code>. P>
DicarywithObjects: Forçays: Code> Méthode dans NSDictionary pour la construction d'un dictionnaire. Si vous devez faire des choses de cette façon, je préfère grandement la méthode alternative
DictionnairewithObjectSandkeys: code> qui fait la même chose mais empêche les touches avec les objets: p>
NSDictionary *item1 = [NSDictionary dictionaryWithObjectsAndKeys:
@"Screen J",
@"Title",
[NSNumber numberWithInt:3],
@"View"];
Je voulais tester si j'ai pu le retirer pour ainsi dire pour que je puisse plus tard essayer de le rendre plus récursif et dynamique par exemple un peu comme celui-ci pour (int i = 0; i <4; + + i) {nsmutableArray * Thechildren = [NsmutableArraRay ArraywithCapacité: 1]; [Thechildren Addobject: [Nstring StringwithFormat: @ "Tester% D", I]]; Nsstring * atterle = [nstring code> Vous pouvez voir le code "complet" ci-dessous. En effet, mon objectif réel est d'une nature plus dynamique. J'essaie d'au moins obtenir le dictionnaire de travailler afin que je puisse commencer à faire cette dynamique. Dernier mais non le moindre thnx pour vous commentaires