Подтвердить что ты не робот

Как написать данные в 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, который хранится в ссылках. Я новичок в этой концепции. Поэтому, если кто-нибудь знает это, пожалуйста, помогите мне. Заранее спасибо. : -)

4b9b3361

Ответ 1

Я не знаю, понимаю ли я ваш вопрос, но если вы хотите записать в .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]];
    }
}

Update:
Нейт Флинк отметил, что некоторые из методов NSFileManager, используемые выше, устарели. Он отправил ответ с помощью методов замены ниже: fooobar.com/questions/283602/...

Ответ 2

Обновленная версия оригинального удивительного примера 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];
    }
}

Ответ 3

Когда вы создадите приложение, он создаст исполняемый файл "appName.app", и все файлы будут созданы в комплекте. Таким образом, вы не можете получить доступ к папке ресурса, когда приложение запущено, потому что все данные находятся в пакете (не в папке).

Однако вы можете получить доступ к временной папке, содержащей некоторую информацию о приложении. Вы можете найти папку temp здесь: Open finder - нажмите на свое имя пользователя (в разделе PLACES) - Библиотека - Поддержка приложений - iPhone Simulator - Пользовательские приложения - (здесь вы можете найти все временные папки ваших iPhone-приложений)

Вы можете получить доступ к этой временной папке:


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

Если вы назовете файл save.plist, вы можете получить доступ к нему следующим образом:

NSString *filePath = [documentsDirectory stringByAppendingString:@"_save.plist"];

Затем вы просто сохраните свой файл в этом файлеPath, и он появится в папке temp с именем "Documents_save.plist".

* Обратите внимание, что имя папки temp меняется каждый раз, когда вы запускаете приложение.

Посоветуйте книгу для вас: "Начало разработки iPhone - изучение iPhone SDK". В главе 11 вы можете найти то, что хотите.

Ответ 4

Подводя итог другим ответам:

Проблема заключается в том, что вы пытаетесь записать файл обратно в папку, содержащую ваше приложение. Эта папка не доступна для записи во время выполнения. Все, что вы делаете, прекрасно, вам просто нужно выбрать другое место для записи своего файла.

Вы можете использовать функцию NSSearchPathForDirectoriesInDomains, чтобы найти более подходящую папку для этих данных. (Например, папку @ "Документы".)

Ответ 5

попробуйте следующее:

-(void)add:(NSRunningApplication *) app { 
   if ([self contains:app]) return; 
   [self.apps addObject:app.localizedName]; 
   [self.apps writeToFile:self.dataFile atomically:YES];
}

из "Cocoa Программирование".

Ответ 6

вам нужно скопировать ваш plist в каталог документов... потому что вы ничего не можете сохранить без сохранения в файл документа... при копировании он позволит писать/изменять на plist