2010-08-25 13 views
43

Tytuł pytania praktycznie go rozdaje - chciałbym, aby moja aplikacja zapamiętała kilka rzeczy. To jakiś rodzaj kalkulatora, więc powinien zapisać ostatnio używane wartości i niektóre ustawienia do wyboru przez użytkownika.Jak zapisać preferencje użytkownika w mojej aplikacji na iPhone'a?

Zasadniczo chciałbym zapisać garść pływających i BOOL-ów i załadować je ponownie przy następnym ładowaniu aplikacji.

Jaki jest najlepszy i najprostszy sposób to zrobić?

Dzięki!

Odpowiedz

125

Jednym z najprostszych sposobów byłoby zapisanie go w NSUserDefaults:

Otoczenie:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

[userDefaults setObject:value 
       forKey:key]; 
// – setBool:forKey: 
// – setFloat:forKey: 
// in your case 
[userDefaults synchronize]; 

Pierwsze:

[[NSUserDefaults standardUserDefaults] objectForKey:key]; 

– boolForKey: 

i

– floatForKey: w twoim przypadku.

+0

Perfect! Dzięki! – Toastor

+1

'-setValue: forKey:' i '-valueForKey', odpowiednio, są również w porządku. Co więcej, "standardoweUserDefaults" są zawsze kopii zapasowej, gdy iDevice jest zsynchronizowany. To świetnie, jeśli chcesz uwzględnić zakupy w aplikacji. – SK9

+0

Dziękuję doskonale działa bardzo dobrze –

6

Oprócz bardzo dobrego podejścia NSUserDefaults, istnieje jeszcze jeden łatwy sposób na przechowywanie danych w NSArray, NSDictionary lub NSData w pliku. Można korzystać z tych metod, a także:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag 

odpowiednio (dla NSDictionary):

+ (id)dictionaryWithContentsOfFile:(NSString *)path 

wystarczy podać prawidłową ścieżkę do lokalizacji. Zgodnie z Przewodnikiem programowania aplikacji iOS katalog/Library/Caches będzie najlepszym miejscem do przechowywania danych, które należy utrwalić między uruchomieniami aplikacji. (Patrz here)

W celu zapisania/załadowania słownika z zachowanej zwanych „menedżerów” w dokumencie directoy można użyć następujących metod:

-(void) loadDictionary { 
    //get the documents directory: 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cacheDirectory = [paths objectAtIndex:0]; 
    //create a destination file name to write the data : 
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory]; 
    NSDictionary* panelLibraryContent = [NSDictionary dictionaryWithContentsOfFile:fullFileName]; 
    if (panelLibraryContent != nil) { 
     // load was successful do something with the data... 
    } else { 
     // error while loading the file 
    } 
} 

-(void) storeDictionary:(NSDictionary*) dictionaryToStore { 
    //get the documents directory: 
    NSArray *paths = NSSearchPathForDirectoriesInDomains 
    (NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cacheDirectory = [paths objectAtIndex:0]; 
    //make a file name to write the data to using the 
    //cache directory: 
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory]; 

    if (dictionaryToStore != nil) { 
     [dictionaryToStore writeToFile:fullFileName atomically:YES]; 
    } 
} 

Zresztą takie podejście jest bardzo ograniczona i trzeba poświęć dużo dodatkowej pracy, jeśli chcesz przechowywać bardziej złożone dane. W takim przypadku interfejs CoreData API jest bardzo przydatny.

+0

Preferencje użytkownika nie są tak naprawdę dokumentami. – SK9

+0

@ SK9: W pierwszej linii wskazałem, że przedstawiam tylko alternatywę dla podejścia NSUserDefaults. Nie mów, że uczciwe/konieczne jest oddanie głosu na ważną alternatywę. – Chris

+2

np. Od twojego linku do dokumentów - "Jeśli twoja aplikacja tworzy duże pliki danych lub ** pliki, które często się zmieniają **, powinieneś rozważyć przechowywanie ich w katalogu Domeny aplikacji/Biblioteka/Pamięć podręczna, a nie w katalogu /Documents Tworzenie kopii zapasowych dużych plików danych może znacznie spowolnić proces tworzenia kopii zapasowych.To samo dotyczy plików, które zmieniają się regularnie.Złożenie tych plików w katalogu pamięci podręcznych zapobiega ich kopii zapasowej (w iOS 2.2 i późniejszych) podczas każdej operacji synchronizacji. " – SK9

3

w Swift:

Ustawianie

let userDefaults = NSUserDefaults.standardUserDefaults() 
userDefaults.setObject(value, forKey: key) 

// userDefaults.setFloat(12.34, forKey: "myFloatKey") 
// userDefaults.setBool(true, forKey: "myBoolKey") 

Zauważ, że dla iOS 8 i później, nazywając userDefaults.synchronize() jest not recommended.

Pierwsze

let userDefaults = NSUserDefaults.standardUserDefaults() 
if let value = userDefaults.objectForKey(key) { 
    print(value) 
} 

Zauważ, że userDefaults.boolForKey i userDefaults.floatForKey zarówno powrócić niż wartości opcjonalne, więc nigdy nie będzie nil (tylko false lub 0.0).

Dalsze czytanie

Powiązane problemy