запись NSArray обратно в список

#iphone #objective-c #ipad

#iPhone #objective-c #iPad

Вопрос:

У меня есть список со следующим форматом:

введите описание изображения здесь

И вот как я это прочитал:

 NSString *errorDesc = nil;
    NSPropertyListFormat format;

    NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];    
    NSData  *plistXML = [[NSFileManager defaultManager] contentsAtPath:path];
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization                     
                                          propertyListFromData:plistXML
                                          mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                          format:amp;format
                                          errorDescription:amp;errorDesc];

    self.statesData = [temp objectForKey:@"Root"];
  

Вопрос в том, хочу ли я записать этот NSMutableArray с именем self.statesData обратно в список, как бы я это сделал? Я предполагаю, что что-то подобное не сработает…

  NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];  
    [self.main.statesData writeToFile:path atomically: YES];
  

Ответ №1:

Вы не можете записать пакет приложения, вам нужно выполнить запись в каталог документов приложения.

Пример кода:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

BOOL status = [array writeToFile:filePath atomically:YES];
  

Если у вас есть начальный dad в пакете приложений при первом запуске, скопируйте его в каталог Documents и выполните все дальнейшие обращения к каталогу Documents.

Комментарии:

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

2. Только что опубликовал код. Для списков свойств просто укажите их как NSArray или NSDictionary в зависимости от типа root,

3. fileName — это выбранное вами имя файла, в вашем случае, вероятно, «States.plist»

Ответ №2:

На iOS вы не можете записывать в файлы в оболочке вашего приложения (а на macOS X вам действительно не следует). Что вам нужно сделать, это сначала скопировать в папку Documents из оболочки приложения, затем загрузить и сохранить в этой версии.

Получение папки с документами:

 NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
;
filePath = [filePath stringByAppendingPathComponent:@"States.plist"];
[self.statesData writeToFile:path atomically:YES];
  

Загрузка файла из оболочки приложения, которую вы уже выполняете; копирование может быть легко выполнено с помощью NSFileManager . Вы можете восстановить временный массив и заменить ключ из ваших statesData перед сохранением. Альтернативная команда чтения может быть:

 self.statesData = [NSArray arrayWithContentsOfFile:filePath];
  

Комментарии:

1. Я читаю это из пакета приложений, однако я пишу это где-то в другом месте… итак, что мне нужно, чтобы изменить мое чтение, чтобы оно загружалось из того, что я пишу

2. Если я понимаю, о чем вы спрашиваете, просто измените строку чтения, которую вы указали выше, на использование пути к файлу. Или используйте метод NSArray arrayWithContentsOfFile:.

Ответ №3:

БЫСТРАЯ версия приведенного выше кода @zaph:

 let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDirectory = paths[0]
let filePath = NSURL(fileURLWithPath: documentsDirectory, isDirectory: true).URLByAppendingPathComponent(fileName)
let status = items.writeToFile(filePath.absoluteString, atomically: true)