1

J'ai un UINavigationController consistant en une vue de table dans laquelle je veux charger des données. J'ai un plist de dictionnaire contenant des dictionnaires pour chaque ligne de train qui a à son tour des dictionnaires pour chaque station avec les informations pertinentes avec une chaîne lineName. J'ai besoin de collecter les clés Names de la station et de les ajouter à un tableau pour remplir ma table (ceci fonctionne).Chargement des données d'un dictionnaire de dictionnaires dans un tableau en Objective C pour une application iphone

Les noms de ligne sont stockés sous forme de chaîne dans mes lignes dictionnaire avec l'être clé « noms de ligne »

Root->| 
     | 
     |->TrainLine1(Dictionary)->| 
     |       |-> lineName (String) 
     |       |-> Station1 (Dictionary) 
     |       |-> Station2 (Dictionary) 
     | 
     | 
     |->TrainLine2(Dictionary)->| 
     |       |-> lineName (String) 
     |       |-> Station1 (Dictionary) 
     |       |-> Station2 (Dictionary) 

Vais-je sur ce dans le mauvais sens? Dois-je réorganiser mon plist? Le code ci-dessous bloque l'application.

- (void)viewDidLoad { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"lineDetails" ofType:@"plist"]; 
    NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    NSDictionary *lineDictionary = [[NSDictionary alloc] initWithDictionary:[dictionary objectForKey:stationNameKey]]; 
    NSMutableArray *stationsOnLine = [[NSArray alloc] init]; 

    NSString *key; 

    for (key in lineDictionary) { 

     NSLog(@"Adding this in array:%@", key); 
     //NSString *key2; 
     NSString *nameToTry = [NSString stringWithString:key]; 
     NSLog(@"nameToTry : %@", nameToTry);  
     //NSMutableDictionary *stationDictionary = [[NSDictionary alloc] init]; 
     if (![key isEqualToString: @"lineName"]) 
     { 
      //NSMutableDictionary *stationDictionary = [[NSDictionary alloc] init]; 
      // NSLog(@"Yes"); 
      //NSMutableDictionary *tempDict = [[NSDictionary alloc] initWithDictionary:[lineDictionary objectForKey:key]]; 
      NSMutableDictionary *stationDictionary = [[NSDictionary alloc] initWithDictionary:[lineDictionary objectForKey:key]]; 
      //stationDictionary = tempDict; 
      NSLog(@"Object for key-- %@",[stationDictionary objectForKey:kStationName]); 
      [stationsOnLine addObject:[stationDictionary objectForKey:kStationName]]; 
      [stationDictionary release]; 
      //[tempDict release]; 
     } 
     /* 
     for (key2 in stationDictionary) 
     { 
      NSLog(@"Adding this in station array:%@", key); 
     } 
      */ 

    } 
    stationNames = stationsOnLine; 
    //[stationDictionary release]; 

    [stationsOnLine release]; 
    [lineDictionary release]; 
    [dictionary release]; 
} 

sortie de la console Debugger:

2010-03-31 00:42:39.842 AMT_Schedule[8395:207] did SelectRow Array contents:deux-montagnes 
2010-03-31 00:42:39.844 AMT_Schedule[8395:207] Adding this in array:sunnybrooke 
2010-03-31 00:42:39.844 AMT_Schedule[8395:207] nameToTry : sunnybrooke 
2010-03-31 00:42:39.845 AMT_Schedule[8395:207] Object for key-- Sunnybrooke 
2010-03-31 00:42:39.846 AMT_Schedule[8395:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object' 
2010-03-31 00:42:39.847 AMT_Schedule[8395:207] Stack: (
    29320283, 
    2521638153, 
    29404219, 
    29404058, 
    107345, 
    107124, 
    17393, 
    3270466, 
    3263806, 
    3306080, 
    3302106, 
    3308563, 
    3289798, 
    3310951, 
    3289447, 
    15819, 
    3066438, 
    3049604, 
    303530, 
    29104832, 
    29101128, 
    37410325, 
    37410522, 
    2793391, 
    8628, 
    8482 
) 
+0

Je pense que j'ai foiré le code avec toutes les expérimentations, je vais regarder de plus près demain matin et le réviser. Vous ne savez pas exactement ce qu'il vous reste à faire pour laisser la question en suspens et la modifier demain ou la supprimer et en commencer une nouvelle si nécessaire demain? Merci. – Khat

Répondre

4
NSMutableArray *stationsOnLine = [[NSArray alloc] init]; 

Devrait être

NSMutableArray *stationsOnLine = [[NSMutableArray alloc] init]; 

Il compile bien parce que le compilateur Obj-C pense que ce un NSMutableArray, mais le pointeur est en fait à une instance NSArray, donc à l'exécution qui est ce que la « méthode muter envoyé au type immuable "erreur est tout. Normalement, cela apparaîtrait comme une erreur de "sélecteur non reconnu", mais je suppose que la façon dont les tableaux sont gérés en interne provoque cet autre message d'erreur plus cryptique.

+0

Il ne plante plus. Merci. J'ai besoin de revoir le code et de corriger certaines choses qui ont été gâchées lorsque j'essayais de résoudre le problème. – Khat

0

Votre code tout me semble bien à (la variable key déclarée en dehors de la déclaration for est un peu inhabituel, mais je ne pense pas qu'il ferait exploser) . Vous ne dites pas quel genre de crash vous voyez, mais la seule raison pour laquelle je peux penser à la raison pour laquelle ce code planterait est le suivant: si l'une des méthodes retourne nil quelque part sur la ligne et que nil est passé en argument une méthode qui ne le prendra pas. Peut-être que vous ne recevez pas un chemin valide de NSBundle, peut-être que le NSDictionary n'est pas créé correctement à partir du chemin, quelque chose comme ça.

+0

Le NSDictionary est créé à partir du bundle et les trainsLineKeys sont stockés et je suis capable de les utiliser comme un en-tête à ma prochaine vue. Je vais copier le fichier journal et l'erreur. – Khat

+0

J'ai modifié le code original avec celui qui est en cours d'exécution et qui se bloque, juste au cas où. Et ajouté le fichier journal. – Khat