Hoe sla ik gebruikersvoorkeuren voor mijn iPhone-app op?

De titel van de vraag verraadt het al: ik wil dat mijn app een paar dingen onthoudt. Het is een soort rekenmachine, dus het zou de laatst gebruikte waarden en enkele door de gebruiker selecteerbare instellingen moeten opslaan.

Eigenlijk wil ik een handvol floats en BOOLs opslaan en deze de volgende keer dat de app wordt geladen opnieuw laden.

Wat is de beste en gemakkelijkste manier om dat te doen?

Bedankt!!


Antwoord 1, autoriteit 100%

Een van de gemakkelijkste manieren is om het op te slaan in de NSUserDefaults:

Instelling:

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

Krijgen:

[[NSUserDefaults standardUserDefaults] objectForKey:key];
– boolForKey:

en

– floatForKey:in jouw geval.


Antwoord 2, autoriteit 5%

Naast de zeer goede NSUserDefaults-aanpak, is er nog een andere gemakkelijke manier om gegevens van een NSArray, NSDictionary of NSData in een bestand op te slaan. U kunt ook deze methoden gebruiken:

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

respectievelijk (voor een NSDictionary):

+ (id)dictionaryWithContentsOfFile:(NSString *)path

je hoeft alleen een geldig pad naar een locatie op te geven. Volgens de iOS Application Programming Guide zou de directory /Library/Caches de beste plaats zijn om gegevens op te slaan die u tussen app-lanceringen moet bewaren. (zie hier)

Om een ​​woordenboek uit een bestand met de naam “managers” in uw documentmap op te slaan/te laden, kunt u deze methoden gebruiken:

-(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];
    }
} 

Hoe dan ook, deze aanpak is zeer beperkt en je moet veel extra werk besteden als je complexere gegevens wilt opslaan. In dat geval is de CoreData API erg handig.


Antwoord 3, autoriteit 5%

In Swift:

Instelling

let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(value, forKey: key)
// userDefaults.setFloat(12.34, forKey: "myFloatKey")
// userDefaults.setBool(true, forKey: "myBoolKey")

Merk op dat voor iOS 8 en hoger het aanroepen van userDefaults.synchronize()niet aanbevolen.

Krijgen

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

Merk op dat userDefaults.boolForKeyen userDefaults.floatForKeybeide niet-optionele waarden retourneren, dus ze zouden nooit nilzijn (alleen falseof 0.0).

Verder lezen


Antwoord 4

U zoekt NSUserDefaults


Antwoord 5

Swift 4 / Linux

Blijkbaar is er iets veranderd. Nu is er de klasse UserDefault.
Controleer deze links:

https://developer.apple.com/documentation/foundation/userdefaults

https://www.hackingwithswift.com /read/12/2/reading-and-write-basics-userdefaults

Other episodes