2013-09-06 3 views
4

Я просмотрел другие подобные вопросы об этом, но ничего действительно не сработало.writeToFile не работает с NSDictionary

Мне удалось написать только одну пару (объект/ключ) словаря (например: setObject: itemProperties [0] forKey [0]) на моем Plist. Но я хотел бы, чтобы все объекты и ключи были добавлены. Пока я не справился (вернул ошибку). Любая помощь?

// Path to Documents Folder 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"items.plist"]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

if (![fileManager fileExistsAtPath: path]) 
{ 
    path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"items.plist"] ]; 
} 

NSMutableDictionary *items; 

if ([fileManager fileExistsAtPath: path]) 
{ 
    items = [[NSMutableDictionary alloc] initWithContentsOfFile: path]; 
} 
else 
{ 
    // If the file doesn’t exist, create an empty dictionary 
    items = [[NSMutableDictionary alloc] initWithCapacity:5]; 
} 

// array of the item properties 
NSArray *itemProperties = @[myItem.itemTitle, myItem.itemImage, myItem.itemPositionX, myItem.itemPositionY, myItem.itemHeight, myItem.itemWidth]; 

// Set the key values for each field  
NSArray *keys = @[@"Title", @"Image", @"PositionX", @"PositionY", @"Height", @"Width"]; 


[items setObject:itemProperties forKey:keys]; 

//Save dictionnary to Plist 
[items writeToFile: path atomically:YES]; 

if (![items writeToFile:path atomically:YES]) { 
    NSLog(@"Error with creating Plist"); 
} 

ответ

8

Правильно ли вы используете действующие ключи & значений?

Этот метод рекурсивно проверяет, что все содержащиеся в нем объекты список собственности объекты (экземпляры NSData, NSDate, NSNumber, NSString, NSArray или NSDictionary) перед выписыванием файл, и возвращает NO, если все объекты не являются объектами списка свойств, так как итоговый файл не будет действительным списком свойств.

Ссылка: writeToFile:atomically:

+0

Спасибо за ваш ответ. Я просто проверил свои массивы, а некоторые объекты в этом списке отсутствуют. – Xavier

17

Вы не можете контролировать содержание вы собираетесь писать иногда. Например, вы не можете избежать значения null, когда собираетесь писать объект JSON, полученный с сервера.

NSData совместит с этим «недействительным» значением, поэтому преобразование NSArrayNSDictionary или в NSData является идеальным способом в этих случаях.

пишут:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:jsonObject]; 
[data writeToFile:path atomically:YES]; 

чтения:

NSData *data = [NSData dataWithContentsOfFile:path]; 
NSDictionary *jsonObject = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
+2

Вместо копирования/вставки вашего ответа из [Почему NSMutableDictionary не хочет записывать в файл?] (Http://stackoverflow.com/questions/8713846/why-nsmutabledictionary-dont-want-write-to-file/20659846# 20659846), вы должны пометить этот вопрос как дубликат того, с которым вы первоначально ответили (если это действительно так). Если это не дубликат, ваш ответ недействителен. – newfurniturey

+0

Извините, я не знал, что могу задать вопрос как дубликат. Я сделаю это в будущем. – Brian

+0

Помогите мне, это хорошо работает! – Gank

Смежные вопросы