2009-07-30 2 views
1

Я пытаюсь создать NSArray из .plist файла, но я получаю эту ошибку:Ошибка при создании nsarray из plist?

«'NSUnknownKeyException', reason: '[<NSCFString 0x5bbca60> valueForUndefinedKey:]: this class is not key value coding-compliant for the key Value1.'»

В .plist файле, я ключ под названием «Пункт 1» и строковое значение, называемое «Value1». Тогда в коде у меня есть NSArray создается из этого файла:

-(void)recordValues:(id)sender { 

    // read "propertyList.plist" values 
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"propertyList" ofType:@"plist"]; 
    originalArray = [[NSArray alloc] initWithContentsOfFile:plistPath]; 

    // dump the contents of the array to the log 
    for (id key in originalArray) { 
     NSLog(@"bundle: key=%@, value=%@", key, [originalArray valueForKey:key]); 
    } 

    //create an NSMutableArray containing the 
    //user's score and the values from originalArray 
    NSMutableArray *newArray = [NSMutableArray arrayWithObjects:[NSNumber numberWithFloat:userScore], nil]; 
    [newArray addObjectsFromArray:array]; 

    //write xml representation of mutableArray back to propertyList 
    [newArray writeToFile:plistPath atomically:NO]; 

} 

    } 
+0

Честно говоря, я просто не могу сказать, что вы пытаетесь сделать. Немного более точный язык, пожалуйста? – Amagrammer

+0

Несомненно! У меня есть список свойств, который является массивом. Они в основном похожи на высокие баллы в игре. Когда кто-то играет в игру, я добавляю свои оценки к новому NSMutableArray. Затем я беру этот новый изменяемый массив и объединяю его с высокими результатами из моего списка свойств и записываю всю коллекцию обратно в исходный файл plist. Но я получаю сообщение об ошибке, и я не знаю, почему. Имеет ли это смысл? – Evelyn

+0

Я забыл, что оставил одну из моих старых переменных там, что не имеет смысла, если вы не знаете, что делает приложение. :) Сожалею. Починил это. – Evelyn

ответ

2

Массивы не имеют ключей (они не нужны, потому что их элементы адресуются их индексами), только словари состоят из пар ключ-значение. Попробуйте:

for (id value in originalArray) { 
      NSLog(@"bundle: value=%@", value); 
    } 
+0

Yay! Это сработало. – Evelyn

0

В вашем for цикле вы используете originalArray как словарь. Если корень вашего plist является словарем, вы должны использовать NSDictionary, а не NSArray, чтобы прочитать его.

+0

Корень NSArray. Как я прочитал его как NSArray? Мне нужно добавить значения, и я не могу добавлять значения в NSDictionary. – Evelyn

+0

точно, если корень «Массив», то вы можете использовать NSArray или NSMutableArray. –

0

Вы можете использовать NSMutableArray сразу вместо NSArray и конвертировать в NSMutableArray, а также убедитесь, что ваш Plist является тип массива. Ваш код будет выглядеть так:

-(void)recordValues:(id)sender { 
// read "propertyList.plist" values 
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"propertyList" ofType:@"plist"]; 
//create an NSMutableArray containing the 
//user's score and the values from originalArray 
NSMutableArray *array = [NSArray arrayWithContentsOfFile: path]; 
[newArray addObjectsFromArray:array]; 
//check-out the content 
NSLog(@"The content of the array: %@", array); 
//write xml representation of mutableArray back to propertyList 
[array writeToFile:plistPath atomically:NO]; 
} 
} 
Смежные вопросы