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?
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).
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)
}
.
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)
}
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
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.
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)
}
}
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")