web-dev-qa-db-fra.com

équivalent aux préférences partagées dans ios

Je porte une application Android sur iOS, une chose que j'ai utilisée était les préférences partagées dans Android pour enregistrer chaque fois qu'un niveau était terminé.

Ainsi, lorsque l'utilisateur revient dans l'application, il peut voir qu'il est au niveau 3 ou peu importe.

Existe-t-il un mécanisme similaire dans iOS? ou dois-je écrire manuellement dans un fichier spécifique à une application?

Si tel est le cas, comment puis-je écrire dans des fichiers uniquement visibles par mon application?

92
FaddishWorm

UtilisezNSUserDefaults: - notez qu'il s'agit de petits bits de données, tels que le niveau actuel, comme vous l'avez mentionné. N'abusez pas de cela et utilisez-la comme base de données volumineuse, car elle est chargée en mémoire chaque fois que vous ouvrez votre application, que vous ayez besoin de quelque chose ou non (d'autres parties de votre application l'utiliseront également).

Objectif c:

En train de lire:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

L'écriture:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

.

Rapide:

En train de lire:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

L'écriture:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}
182
SomeGuy

Voici une mise à jour pour Swift 3

En train de lire

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

L'écriture

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

Mettre à jour

De Documentation UserDefaults

synchronize() attend toutes les mises à jour asynchrones en attente de la base de données par défaut et renvoie; cette méthode est maintenant inutile et ne doit pas être utilisée.

29
Ben

Comme indiqué dans la réponse précédente, vous savez déjà que UserDefaults est l'équivalent des préférences partagées dans iOS. Vous pouvez créer une fonction d'écriture commune et créer une fonction de lecture en fonction du type de données. Et appelez votre méthode requise de n'importe où.

ViewController.Swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

Utils.Swift

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
0
Md Imran Choudhury
class Configuration {

    static func value<T>(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

Exemple

Configuration.value(value: "my_value", forKey: "key_1")

let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")
0
Hasanaga