Загрузка данных из словаря словарей в массив в Objective C для приложения для iphone - PullRequest
1 голос
/ 31 марта 2010

У меня есть UINavigationController, состоящий из табличного представления, в которое я хочу загрузить некоторые данные.У меня есть список словарей, содержащий словари для каждой железнодорожной линии, которые, в свою очередь, имеют словари для каждой станции с соответствующей информацией вместе с одной строкой lineName.Мне нужно собрать ключи Имен станции и добавить их в массив для заполнения моей таблицы (это работает).

Имена строк хранятся в моем словаре строк как строка с ключом "lineName"

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

Я поступаю неправильно?Должен ли я реорганизовать свой список?Приведенный ниже код вызывает сбой приложения.

- (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];
 }

Вывод консоли отладчика:

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
)

Ответы [ 2 ]

4 голосов
/ 31 марта 2010
 NSMutableArray *stationsOnLine = [[NSArray alloc] init];

Должно быть

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

Он прекрасно компилируется, потому что компилятор Obj-C считает, что это NSMutableArray, но указатель фактически на экземпляр NSArray, поэтому во время выполнения это и есть ошибка "метод мутирования, отправленный неизменяемому типу". Обычно это выявляется как ошибка «нераспознанного селектора», но я предполагаю, что способ внутренней обработки массивов вызывает другое, более загадочное сообщение об ошибке.

0 голосов
/ 31 марта 2010

Ваш код выглядит нормально для меня (переменная key, объявленная вне оператора for, немного необычна, но я не думаю, что она взорвется). Вы не говорите, какой вид сбоя вы видите, но единственная причина, по которой я могу подумать, почему этот код вылетает, это если один из методов возвращает nil где-то вдоль строки, а затем nil передается в качестве аргумента метод, который не примет это. Возможно, вы не получаете верный путь от NSBundle, возможно, NSDictionary не создается должным образом из этого пути, что-то в этом роде.

...