2011-08-14 8 views
15

Niedawno jestem starszym w liceum i jestem zainteresowany tworzeniem aplikacji na iPhone'a. Niedawno ukazała się jedna z moich aplikacji: NBlock. Jest to aplikacja do układania puzzli i jest bardzo trudna. Ma jednak kilka problemów. Najlepsze wyniki nie są zapisywane. Powiedziano mi, żebym używał plistu. Jakieś wskazówki?Jak korzystać z pList w programowaniu na iOS

+4

Możesz zacząć od przeczytania [samouczek plist Apple] (http://developer.apple.com/library/mac/documentation/Cocoa/Conoa/PublicLists/QuickStartPlist/QuickStartPlist.html). – Jon7

Odpowiedz

12

Metoda URL oparty na to:

// Get the URL for the document directory 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 
NSURL *documentDirectoryURL = [[fileManager URLsForDocumentDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0]; 

// Turn the filename into a string safe for use in a URL 
NSString *safeString = [@"scores.plist" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

// Create an array for the score 
NSMutableArray *array = [[NSMutableArray alloc] init];  
[array addObject:[NSNumber numberWithInt:score]]; 

// Write this array to a URL 
NSURL *arrayURL = [NSURL URLWithString:safeString relativeToURL:documentDirectoryURL]; 
[array writeToURL:arrayURL atomically:YES]; 
+1

Dla mnie wydaje się dużo czystsze i bardziej przejrzyste, aby użyć '- [NSURL URLByAppendingPathComponent:]' dla adresów URL plików zamiast względnego adresu URL. Pozwoliłoby to na uniknięcie potrzeby ucieczki ścieżki procentowej i generalnie mniej podatne na błędy. –

3

Unikałbym używania plist. Najłatwiejszym sposobem na zapisanie prostych danych w aplikacji jest zdecydowanie NSUserDefaults.

Zapoznaj się z this tutorial, aby uzyskać prosty przewodnik na temat korzystania z NSUserDefaults. Zawsze pamiętaj, aby synchronizeNSUserDefaults po zakończeniu pisania do nich.

Jeśli szukasz bardziej wydajnego (ale bardziej złożonego) sposobu na zapisywanie danych, zapoznaj się z przewodnikiem Apple'a dotyczącym używania Core Data.

+0

Myślałem, że NSUserDefaults był zalecany dla standardowych ustawień domyślnych, które chcesz zachować związane z preferencjami językowymi i tym podobne? – cheznead

2

Zajrzyj do NSKeyedArchiver/Unarchiver. Możesz zapisać prawie wszystko, co chcesz; NSUserDefaults, z mojego doświadczenia, zrzuca twoje dane, jeśli zabijesz swoją aplikację z zasobnika. Dane podstawowe są lepiej używane, jeśli zarządzasz dużymi ilościami danych za pomocą baz danych, takich jak sqlite.

+1

Nigdy nie miałem tego problemu z poprawnie 'synchronize'd' NSUserDefaults'. – mopsled

+1

Zajmę się tym, dzięki. NSUserDefaults jest naprawdę dobry tylko wtedy, gdy po prostu zapisujesz prosty ciąg lub coś podobnego (domyślam się, że pytający może być dobrym kandydatem), o ile można go trwale zapisać. –

+0

Sprawdź link dodany w mojej odpowiedzi, aby zobaczyć, jak sobie z tym poradzić. – mopsled

3

Herezje co chcesz:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"scores.plist"]; 
NSMutableArray *array = [[NSMutableArray alloc] init];       
[array addObject:[NSNumber numberWithInt:score]];         
[array writeToFile:path atomically:YES]; 

i dodanie nowych zdobywa zrobić initWithContentsOfFile:@"scores.plist" zamiast init w deklaracji array. Możesz opcjonalnie użyć NSUserDefaults.

+1

Czy ktoś, kto jest na komputerze, powinien sformatować kod źródłowy w moim poście, prawda? To niemożliwe na moim iPodzie .... – JonasG

+0

+1. Czy warto dodać wersję opartą na adresie URL? – Abizern

+0

Co przez to rozumiesz? 'writeToURL: automatycznie:'? – JonasG

0

powiedziałbym poniższy kod działa i całkiem prosto do przodu, chyba typów danych obiekt niestandardowy (jego inna historia ponownie) stosowane są:

NSString* plistPath = nil; 
NSFileManager* manager = [NSFileManager defaultManager]; 
if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"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]; 
    } 
    } 

Ustawienie atrybutu daty może być pomocne w sprawdzeniu, kiedy jest ostatnio aktualizowany wynik.

Powiązane problemy