Как написать данные в plist?
Я создал save.plist в папке с ресурсами. Я написал некоторые данные внутри этого напрямую (без использования кодирования). Я могу прочитать эти данные, но я не могу писать код в тот же файл save.plist. Используя следующий код, я пытаюсь записать данные, но он сохраняется в моем .app plist. Код здесь
NSString *errorDesc = nil; NSPropertyListFormat format; NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"save" ofType:@"plist"]; NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; NSMutableDictionary *temp = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; if (!temp) { NSLog(errorDesc); [errorDesc release]; } // [temp setValue:@"123" forKey:@"line1"]; // [temp writeToFile:plistPath atomically: YES]; //Reading data from save.plist NSLog([temp objectForKey:@"name"]); NSLog([temp objectForKey:@"wish"]); NSNumber *num=[temp valueForKey:@"roll"]; int i=[num intValue]; printf("%d",i); //writitng the data in save.plist [temp setValue:@"green" forKey:@"color"]; [temp writeToFile:plistPath atomically: NO]; NSMutableDictionary *temp1 = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; NSLog([temp objectForKey:@"color"]);
Я хочу, чтобы данные, которые я хочу написать, должны записываться только в файл save.plist, который хранится в ссылках. Я новичок в этой концепции. Поэтому, если кто-нибудь знает это, пожалуйста, помогите мне. Заранее спасибо. 🙂
- Apple Mach-O и множественные ошибки «неопределенных символов» с использованием OpenCV
- Не удалось добавить объекты в NSMutableArray в Objective C
- Ошибка Apple Mach-O Linker при компиляции для устройства
- Ошибка AdMob с помощью : непризнанный селектор
- Полужирный и нежирный текст в одном UILabel?
- Расчет скорости соединения / загрузки
- strong / weak / keep / unsafe_unretained / assign
- Сравните два массива с одинаковым значением, но с другим порядком
- objective-C: Как получить адрес маршрутизатора?
- Как получить счетчик ссылок NSObject?
- Как перехватить ссылку на ссылку в UITextView?
- Класс Foo реализован как в MyApp, так и в MyAppTestCase. Один из двух будет использован. Какой из них не определен
- Использование MPMediaItems с AVAudioPlayer
Я не знаю, понимаю ли я ваш вопрос, но если вы хотите записать в .plist в своем пакете .app, вы, вероятно, делаете что-то неправильно. Если вы хотите сохранить настройки, вам следует использовать NSUserDefaults .
Если вы действительно хотите изменить связанный .plist – вот какой-то код:
NSString *plistPath = nil; NSFileManager *manager = [NSFileManager defaultManager]; if (plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Contents/Info.plist"]) { if ([manager isWritableFileAtPath:plistPath]) { NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath]; [infoDict setObject:[NSNumber numberWithBool:hidden] forKey:@"LSUIElement"]; [infoDict writeToFile:plistPath atomically:NO]; [manager changeFileAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] atPath: [[NSBundle mainBundle] bundlePath]]; } }
Обновить:
Нейт Флинк отметил, что некоторые из методов NSFileManager, используемые выше, устарели. Он отправил ответ с приведенными ниже методами замены: https://stackoverflow.com/a/12428472/100848
Обновленная версия оригинального удивительного примера Weichsel (спасибо!). Xcode бросил пару предупреждений, один из которых является устаревшим методом в NSFileManager. Обновлено здесь с использованием устаревших методов от iOS 5.1
NSString *plistPath = nil; NSFileManager *manager = [NSFileManager defaultManager]; if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"mySpecial/PathTo.plist"])) { if ([manager isWritableFileAtPath:plistPath]) { NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath]; [infoDict setObject:@"foo object" forKey:@"fookey"]; [infoDict writeToFile:plistPath atomically:NO]; [manager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[[NSBundle mainBundle] bundlePath] error:nil]; } }
Когда вы создадите приложение, он создаст исполняемый файл «appName.app», и все файлы будут созданы в комплекте. Поэтому при запуске приложения вы не можете получить доступ к папке ресурсов, потому что все данные находятся в комплекте (а не в папке).
Однако вы можете получить доступ к папке temp, содержащей некоторую информацию о приложении. Вы можете найти временную папку здесь: Открыть поисковик – нажмите на свое имя пользователя (под PLACES) – Библиотека – Поддержка приложений – iPhone Simulator – Пользовательские приложения – (здесь вы можете найти все временные папки вашего iPhone приложения)
Вы можете получить доступ к этой временной папке:
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentsDirectory = [paths objectAtIndex:0];
Если вы назовете файл save.plist, вы можете получить доступ к нему следующим образом:
NSString *filePath = [documentsDirectory stringByAppendingString:@"_save.plist"];
Затем вы просто сохраните файл в этом файлеPath, и он появится во временной папке с именем «Documents_save.plist».
* Обратите внимание, что имя папки temp меняется каждый раз, когда вы запускаете приложение.
Рекомендовать книгу для вас: «Начало разработки iPhone – изучение iPhone SDK». В главе 11 вы можете найти то, что хотите.
Чтобы обобщить некоторые другие ответы:
Проблема в том, что вы пытаетесь записать файл обратно в папку, содержащую ваше приложение. Эта папка не доступна для записи во время выполнения. Все, что вы делаете, прекрасно, вам просто нужно выбрать другое место для записи своего файла.
Вы можете использовать функцию NSSearchPathForDirectoriesInDomains, чтобы найти более подходящую папку для этих данных. (Например, папку @ «Документы».)
попробуй это:
-(void)add:(NSRunningApplication *) app { if ([self contains:app]) return; [self.apps addObject:app.localizedName]; [self.apps writeToFile:self.dataFile atomically:YES]; }
от «Программирование cocoa».
вам нужно скопировать ваш plist в каталог документов … потому что вы ничего не можете сохранить без сохранения в файл документа … при копировании он позволит писать / изменять на plist