2012-02-17 18 views
5

Sto creando un'applicazione in cui è necessario memorizzare alcune informazioni fornite dall'utente. Io cerco di utilizzare un file .plist per memorizzare le informazioni, ho trovato questo:iPhone read/write .plist file

NSString *filePath = @"/Users/Denis/Documents/Xcode/iPhone/MLBB/data.plist"; 
NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 
[plistDict setValue:@"Man" forKey:@"Gender"]; 
[plistDict writeToFile:filePath atomically: YES]; 

Il problema è che l'applicazione funziona solo finché sto testando nel simulatore di iPhone. Ho provato questo Changing Data in a Plist ma senza fortuna. Ho anche letto qualcosa a riguardo che ho bisogno di aggiungerlo al mio pacchetto, ma come?

Nuovo codice:

- (IBAction)segmentControlChanged{ 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *plistLocation = [documentsDirectory stringByAppendingPathComponent:@"data.plist"]; 
NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:plistLocation]; 

if (Gender.selectedSegmentIndex == 0) { 
    [plistDict setObject:@"Man" forKey:@"Gender"]; 
    [plistDict writeToFile:plistLocation atomically: YES]; 
} 
else 
{ 
    [plistDict setObject:@"Women" forKey:@"Gender"]; 
    [plistDict writeToFile:plistLocation atomically: YES]; 
} 
} 

risposta

8

Si sta utilizzando lo stesso percorso sul vostro dispositivo? Le app su un dispositivo sono in modalità sandbox e possono solo leggere/scrivere file nella directory dei documenti. Prendi il percorso del file like this e aggiungi il tuo nome plist. Questo approccio funzionerà anche sul simulatore.

Prova questo:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *plistLocation = [documentsDirectory stringByAppendingPathComponent:@"myplist.plist"]; 
+0

No, non ho provato a farlo funzionare su un dispositivo "reale", ma non mi aspetto che verrà eseguito, perché la directory non esiste su un dispositivo "reale". So che possono essere letti/scritti solo dalla loro directory, ma come faccio a dire a Xcode di usare il file denominato data.plist nella directory delle applicazioni invece di/Users/Denis/Documents/Xcode/iPhone/MLBB/data. plist? Mi sento come n00b :-) – Deni

+0

Quel link che ho postato mostra come ottenere la directory dei documenti come una stringa. Utilizzare stringByAppendingString per aggiungere il nome del plist alla fine, quindi utilizzare il codice specificato. Questo è tutto :) – Nick

+0

Scusa, ma non so cosa intendi. Ho scritto NSString * filePath = [NSHomeDirectory() stringByAppendingPathComponent: @ "Documenti"]; Ma non penso che sia ciò che intendi. Puoi per favore modificare il codice qui sopra in modo che funzioni e quando lo scrivi qui. Sono nuovo di Xcode e ora so come ci si sente ad essere un n00b :-) – Deni

14

Credo che aver aggiunto il file plist nella cartella risorse in Xcode (dove abbiamo posto delle immagini, se non allora avete bisogno di inserire quella prima). I dati delle risorse vanno a [NSBundle mainBundle] per impostazione predefinita e iOS non ci consente di modificare i dati all'interno del pacchetto. Quindi, per prima cosa è necessario copiare quel file nella directory dei documenti.

Questo è il codice per copiare il file da NSBundle alla directory Documenti.

- (NSString *)copyFileToDocumentDirectory:(NSString *)fileName { 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, 
                 YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    NSString *documentDirPath = [documentsDir 
             stringByAppendingPathComponent:fileName]; 

    NSArray *file = [fileName componentsSeparatedByString:@"."]; 
    NSString *filePath = [[NSBundle mainBundle] 
             pathForResource:[file objectAtIndex:0] 
                ofType:[file lastObject]]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    BOOL success = [fileManager fileExistsAtPath:documentDirPath]; 

    if (!success) { 
     success = [fileManager copyItemAtPath:filePath 
             toPath:documentDirPath 
             error:&error]; 
     if (!success) { 
     NSAssert1(0, @"Failed to create writable txt file file with message \ 
             '%@'.", [error localizedDescription]); 
     } 
    } 

    return documentDirPath; 
} 

Ora è possibile utilizzare la tornata documentDirPath per accedere il file e manipolare (lettura/scrittura) su quella.

La struttura plist è:

<array> 
    <dict>key-value data</dict> 
    <dict>key-value data</dict> 
</array> 

Ecco il codice per scrivere i dati in file plist:

/* Code to write into file */ 

- (void)addToMyPlist { 
    // set file manager object 
    NSFileManager *manager = [NSFileManager defaultManager]; 

    // check if file exists 
    NSString *plistPath = [self copyFileToDocumentDirectory: 
                 @"MyPlistFile.plist"]; 

    BOOL isExist = [manager fileExistsAtPath:plistPath];  
    // BOOL done = NO; 

    if (!isExist) { 
     // NSLog(@"MyPlistFile.plist does not exist"); 
     // done = [manager copyItemAtPath:file toPath:fileName error:&error]; 
    } 
    // NSLog(@"done: %d",done); 

    // get data from plist file 
    NSMutableArray * plistArray = [[NSMutableArray alloc] 
              initWithContentsOfFile:plistPath]; 

    // create dictionary using array data and bookmarkKeysArray keys 
    NSArray *keysArray = [[NSArray alloc] initWithObjects:@"StudentNo", nil]; 
    NSArray *valuesArray = [[NSArray alloc] initWithObjects: 
            [NSString stringWithFormat:@"1234"], nil]; 

    NSDictionary plistDict = [[NSDictionary alloc] 
                initWithObjects:valuesArray 
                  forKeys:keysArray]; 

    [plistArray insertObject:poDict atIndex:0]; 

    // write data to plist file 
    //BOOL isWritten = [plistArray writeToFile:plistPath atomically:YES]; 
    [plistArray writeToFile:plistPath atomically:YES]; 

    plistArray = nil; 

    // check for status 
    // NSLog(@" \n written == %d",isWritten); 
} 
+0

Cosa farò con questo codice? Ho provato a incollarlo, ma non ha funzionato. E ho bisogno di mettere il nome del file da qualche parte? – Deni

+0

Dov'è la cartella delle risorse? – Deni

+0

Questo codice serve per ottenere il percorso per il file plist, che non è altro che "plistLocation" nel codice. Per prima cosa aggiungi i file plist, con le tue immagini. Quindi chiamare questo metodo per ottenere il percorso del file plist, memorizzarlo nella variabile "plistLocation" e il resto va bene con il codice – Mrunal