2011-10-02 10 views
7

Śledzę tę odpowiedź do zapisu danych w plistJak zapisać dane w plist?

How to write data to the plist?

Ale do tej pory mój plist w ogóle nie zmienia.

Oto mój kod: -

- (IBAction)save:(id)sender 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"drinks" ofType:@"plist"]; 
    NSString *drinkName = self.name.text; 
    NSString *drinkIngredients = self.ingredients.text; 
    NSString *drinkDirection = self.directions.text; 
    NSArray *values = [[NSArray alloc] initWithObjects:drinkDirection, drinkIngredients, drinkName, nil]; 
    NSArray *keys = [[NSArray alloc] initWithObjects:DIRECTIONS_KEY, INGREDIENTS_KEY, NAME_KEY, nil]; 
    NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys]; 
    [self.drinkArray addObject:dict]; 
    NSLog(@"%@", self.drinkArray); 
    [self.drinkArray writeToFile:path atomically:YES]; 
} 

Czy muszę wykonać coś ekstra?

Jestem nowym użytkownikiem iPhone SDK, więc każda pomoc będzie doceniana.

Odpowiedz

35

Próbujesz zapisać plik w pakiecie aplikacji, co nie jest możliwe. Zapisz plik w folderze Dokumenty.

Metoda pathForResource może być używana wyłącznie do odczytu zasobów dodanych do projektu w Xcode.

Oto, co zwykle zrobić, gdy chcesz zmodyfikować plist w aplikacji:
1. Skopiuj drinks.plist ze swojego pakietu aplikacji do folderu Dokumenty o aplikacji na pierwszym uruchomieniem (za pomocą NSFileManager).
2. Plik ten można wykorzystywać tylko w folderze Dokumenty podczas odczytu/zapisu.

UPDATE

To w jaki sposób zainicjować drinkArray właściwość:

NSString *destPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
destPath = [destPath stringByAppendingPathComponent:@"drinks.plist"]; 

// If the file doesn't exist in the Documents Folder, copy it. 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

if (![fileManager fileExistsAtPath:destPath]) { 
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"drinks" ofType:@"plist"]; 
    [fileManager copyItemAtPath:sourcePath toPath:destPath error:nil]; 
} 

// Load the Property List. 
drinkArray = [[NSArray alloc] initWithContentsOfFile:destPath]; 
+0

Bardzo dziękuję za odpowiedź. Właśnie uczę się iPhone'a SDK, więc możesz mi powiedzieć, jak go skopiować przy pierwszym uruchomieniu. Gdzie powinienem umieścić kod, aby skopiować moją .plist do mojego pakietu aplikacji? i skąd mam wiedzieć, że został skopiowany z powodzeniem? Dzięki. – Varundroid

+3

Dodałem przykład do mojej odpowiedzi. :) – chrisklaussner

+0

Wielkie dzięki ChristianK. :) – Varundroid

Powiązane problemy