2010-05-12 5 views
0

Quel type de données utilisez-vous pour extraire des éléments dont le type est dictionnaire dans plist, c'est-à-dire nsmutabledictionary ou nsdictionary? Parce que j'utilise le code suivant pour récupérer des objets du dictionnaire d'un tableau de dictionnaires dans Plist.Problème avec l'extraction d'objets de dictionnaire dans un tableau à partir de plist iphone sdk

NSMutableDictionary *_myDict = [contentArray objectAtIndex:0]; //APP CRASHES HERE 

NSLog(@"MYDICT : %@",_myDict); 
NSString *myKey = (NSString *)[_myDict valueForKey:@"Contents"] ; 

[[cell lblFeed] setText:[NSString stringWithFormat:@"%@",myKey]]; 

Ici, à la première ligne, je vois objc_msgsend. ContentArray est un nsarray et son contenu montre 2 objets qui sont là dans plist. En plist ils sont des objets de dictionnaire. Alors pourquoi cette erreur?

EDIT:

Fondamentalement, le contenu de mon contentArray dans la console sont indiquées ci-dessous:

CONTENT ARRAY : 
(
    { 
    favourites = 0; 
    id = 0; 
    story = "This is my first record"; 
    timestamp = 324567; 
}, 
    { 
    favourites = 0; 
    id = 1; 
    story = "This is my second record"; 
    timestamp = 321456; 
} 
) 

Je veux récupérer ces objets dictionnaire de tableau de contenu.

Quelqu'un peut-il aider s'il vous plaît?

C'est vraiment urgent.

Merci d'avance.

+0

Quels sont le contenu exact de votre .plist (ne pas simplement le résumer)? Et quel est le message d'erreur exact? Si l'erreur provoque le blocage de votre application, sur quelle ligne se bloque-t-elle? –

+0

le contenu de la sonde est comme ci-dessus. Je reçois un message objc_msgsend, rien dans la console. App se bloque à la ligne mentionnée. – neha

+0

Et quelle est "l'histoire" là-bas? Et quel est le tag "Root"? PList a une syntaxe plutôt stricte. Array est "array" là, les dictionnaires utilisent "dict" tag, etc – bealex

Répondre

2

NSDictionary. Vous ne pouvez pas simplement dire

NSMutableDictionary *_myDict = [contentArray objectAtIndex:0]; 

et espérons que c'est un dictionnaire mutable maintenant. C'est toujours un dissentiment immuable normal. Donc, vous devriez écrire quelque chose comme:

NSMutableDictionary *_myDict = [NSMutableDictionary dictionaryWithDictionary:[contentArray objectAtIndex:0]]; 

Cela va créer un dictionnaire mutable à partir de celui qui est dans le plist.

Vous pouvez lire à ce sujet dans la "Liste des propriétés Guide de programmation", http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/PropertyLists/index.html

Mise à jour:

Vous avez également un contenu plist étrange. types xml-plist disponibles sont mentionnés ici: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html#//apple_ref/doc/uid/10000048i-CH3-SW1

et la structure xml-plist global est décrit ici: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/PropertyLists/UnderstandXMLPlist/UnderstandXMLPlist.html#//apple_ref/doc/uid/10000048i-CH6-SW1

pièce de travail du Code

void test() { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSMutableArray *arrayIWillWrite = [NSMutableArray array]; 
    NSMutableDictionary *dictionary; 

    dictionary = [NSMutableDictionary dictionary]; 
    [dictionary setObject:[NSNumber numberWithInt:0] forKey:@"favourites"]; 
    [dictionary setObject:[NSNumber numberWithInt:0] forKey:@"id"]; 
    [dictionary setObject:@"This is my first record" forKey:@"story"]; 
    [dictionary setObject:[NSNumber numberWithInt:324567] forKey:@"timestamp"]; 
    [arrayIWillWrite addObject:dictionary]; 

    dictionary = [NSMutableDictionary dictionary]; 
    [dictionary setObject:[NSNumber numberWithInt:0] forKey:@"favourites"]; 
    [dictionary setObject:[NSNumber numberWithInt:1] forKey:@"id"]; 
    [dictionary setObject:@"This is my second record" forKey:@"story"]; 
    [dictionary setObject:[NSNumber numberWithInt:321456] forKey:@"timestamp"]; 
    [arrayIWillWrite addObject:dictionary]; 

    [arrayIWillWrite writeToFile:@"/Users/alex/test.plist" atomically:NO]; 

    NSArray *arrayThatWasRead = [NSArray arrayWithContentsOfFile:@"/Users/alex/test.plist"]; 
    NSLog(@"%@", arrayThatWasRead); 

    NSDictionary *dictionaryFromArrayThatWasRead = [arrayThatWasRead objectAtIndex:0]; 
    NSLog(@"%@", dictionaryFromArrayThatWasRead); 

    [pool release]; 
} 
+0

Alexander Babaev, j'ai essayé de faire ce que vous avez suggéré, mais sans succès, il me montre encore objc_msgsend à la même ligne. Je veux récupérer le premier objet dictionnaire de nsarray. – neha

+0

Pouvez-vous montrer le message exact qu'il vous montre? Quel message est faux et à quel objet est-il envoyé? – bealex

+0

Il me montre objec_msgsend. Rien dans la console. Ici, je crée un tableau de nsdictionaries. Est-ce correct? Ou ce devrait être un dictionnaire de tableaux? – neha

Questions connexes