web-dev-qa-db-fra.com

Swift - Comment définir la valeur initiale pour NSUserDefaults

J'ai un commutateur appelé soundSwitch, je sauvegarde l'état du bouton en utilisant un paramètre utilisateur par défaut en tant que tel:

@IBAction func soundsChanged(sender: AnyObject) {
        if soundSwitch.on{
            defaults.setBool(true, forKey: "SoundActive")
            print("Sound ON")
        }else{
            defaults.setBool(false, forKey: "SoundActive")
            print("Sound OFF")
        }
    }

Actuellement, la valeur par défaut réelle est initialement fausse lorsque l'utilisateur lance l'application pour la première fois. 

Comment implémenter les valeurs par défaut comme étant vraies si l'utilisateur lance d'abord l'application et si elles n'ont pas encore été configurées.

J'ai vu des méthodes dans Objective-C, mais rien dans Swift. D'après ce que j'ai vu, vous pouvez le faire dans l'application, déléguer un peu comment, ou dans un fichier Plist. Comment puis-je faire l'un ou l'autre?

24

Exemple de syntaxe Swift 3

Enregistrez une valeur booléenne par défaut:

UserDefaults.standard.register(defaults: ["SoundActive" : true])

Et pour obtenir la valeur:

UserDefaults.standard.bool(forKey: "SoundActive")

Note: Bien que le code ci-dessus retourne true, notez que la valeur n'est pas écrite sur le disque tant que vous n'avez pas défini set it:

UserDefaults.standard.set(true, forKey: "SoundActive")
49
Novi

Ajoutez ceci à votre méthode didFinishLaunchingWithOptions à partir de AppDelegate. Comme d'autres l'ont souligné, essayez de ne pas abuser en mettant tout dans cette méthode.

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    /// Here you can give default values to your UserDefault keys
    UserDefaults.standard.register(defaults: [
        "SoundActive": true,
        "someOtherKey": "Some Message"
        ])
}
9
fs_tigre

À l'aide de "registerDefaults", vous pouvez définir la valeur par défaut de NSUserDefaults

let userDefaultsDefaults = [
            "SoundActive" : true
        ]

NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)

Remarque: écrivez ceci dans didFinishLaunchingWithOptions, donc la valeur par défaut est définie.

écrivez ci-dessous le code où vous voulez vérifier

 let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool!

 if (onoroff != nil && onoroff == false)
 {
    self.checkForAgreement()
 }
7
Hardik Thakkar

Il n'y a rien de Swift ou de délégué d'application spécifique.

Les valeurs par défaut initiales sont définies en appelant registerDefaults: dans l'instance standardUserDefaults.

Vous pouvez passer cet appel plusieurs fois et je vous recommande de ne pas le faire dans le délégué de l'application, mais d'enregistrer les détails appropriés à des moments appropriés dans l'application. Par conséquent, si vous avez 1 contrôleur de vue/sous-système qui utilise certaines valeurs par défaut, enregistrer les valeurs par défaut dans le cadre de l'initialisation si ce code.

Si vous avez quelque chose qui est utilisé par plusieurs parties différentes du code, envisagez de le faire dans le délégué de l'application, puis uniquement si vous n'avez pas d'autre contrôleur approprié pour le faire.

4
Wain
func lastStatus() -> Bool {
    let defaultValue = true
    if let value = default.valueForKey("SoundActive") {
        // then use it
        return value as? Bool ?? defaultValue
    } else {
        // oh, no value?
        return defaultValue
    }
}

Je pense que c'est la meilleure façon de l'utiliser. register(defaults:) aidera également, mais dans la documentation, Apple suggère de l’utiliser comme fallback, comme séparer la situation entre no value et default value. Dépend de vos besoins.

2
Klein Mioke

Si vous voulez vraiment le faire de cette façon, mettez ceci dans AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let defaults = NSUserDefaults.standardUserDefaults()
    if defaults.valueForKey("SoundActive") == nil {
        defaults.setBool(true, forKey: "SoundActive")
    }

S'il est uniquement utilisé dans le contrôleur de vue, envisagez de placer le code dans la méthode viewDidLoad!

0
Dominic

Swift 4

Je préfère implémenter une fonction similaire à UserDefaults.string (forKey:) qui renvoie nil si la valeur n'est pas définie. Combiné avec le ?? opérateur, aucune valeur par défaut n'est écrite sur le disque, à moins que vous ne les définissiez explicitement ultérieurement.

extension UserDefaults {

    public func optionalInt(forKey defaultName: String) -> Int? {
        let defaults = self
        if let value = defaults.value(forKey: defaultName) {
            return value as? Int
        }
        return nil
    }

    public func optionalBool(forKey defaultName: String) -> Bool? {
        let defaults = self
        if let value = defaults.value(forKey: defaultName) {
            return value as? Bool
        }
        return nil
    }
}

Ensuite, vous pouvez récupérer vos valeurs par défaut comme suit

let defaults = UserDefaults.standard
let userName = defaults.string(forKey: "Username") ?? "Happy"
let userAge = defaults.optionalInt(forKey: "Age") ?? 21
let isSmart = defaults.optionalInt(forKey: "Smart") ?? true
0
Guy Brooker