web-dev-qa-db-fra.com

Swift 4 Settings Bundle, obtenez les valeurs par défaut

J'ai créé un ensemble de paramètres avec environ 8 commutateurs à bascule. Ce que j'essaie de faire obtient les valeurs par défaut du paquet de paramètres. Actuellement, j'ai ces deux méthodes:

func registerSettingsBundle(){
        let appDefaults = [String:AnyObject]()
        UserDefaults.standard.register(defaults: appDefaults)
        UserDefaults.standard.synchronize()
    }

    func updateDisplayFromDefaults(){
        let defaults = UserDefaults.standard
        let update_lot = defaults.bool(forKey: "update_lot")
        print(update_lot)
    }

et j'appelle ces méthodes dans mon viewDidLoad

override func viewDidLoad() {
        super.viewDidLoad()
        registerSettingsBundle()
        updateDisplayFromDefaults()
    }

Cependant, cela ne me donne pas les valeurs par défaut (qui sont toutes vraies, mais elles retournent toutes fausses). Cela fonctionne et me donne les valeurs correctes si je ferme l'application, ouvre les paramètres, ajuste les paramètres et rouvre l'application. Est-il possible d'obtenir les paramètres par défaut? J'ai choisi de lire le plist, mais si je modifiais les paramètres de mon groupe de paramètres, cela ne prendrait pas effet.

6
user979331

cela ne me donne pas les valeurs par défaut (qui sont toutes vraies, mais elles retournent toutes fausses)

On dirait que vous avez un commutateur à bascule qui affiche ON dans le groupe de paramètres et lorsque vous lisez le groupe, vous obtenez toutes les valeurs fausses.

Si tel est le cas, il vous manque quelque chose ici.

En définissant bundle (Root.plist), nous avons le champ "Valeur par défaut" qui n'a rien à voir avec la valeur réelle par défaut du commutateur à bascule. Il s’agit simplement d’un indicateur visuel permettant de passer de .. à .. La "valeur par défaut" peut être définie sur "OUI" dans la liste d’expert, mais lorsque vous essayez de lire la valeur, vous obtenez (faux} _. 

 enter image description here

Ici, j'ai défini valeur par défaut} pour le rappel dans Root.plist comme YES et pour Mise à jourNON Ainsi, lors du lancement de l'application cela se voit comme ci-dessus.

Mais quand j'ai essayé de lire ces valeurs par défaut, cela donne false.

func getDefaults() {        
    let stanDefaults = UserDefaults.standard
    print("Default value of Update - \(stanDefaults.bool(forKey: "update_lot_pref"))")
    print("\nDefault value of Reminder - \(stanDefaults.bool(forKey: "reminder_pref"))")
}

Valeur par défaut de mise à jour - false Valeur par défaut de rappel - false

Maintenant, si vous voulez synchroniser ces valeurs - la valeur par défaut dans Root.plist et la valeur par défaut -, vous devez le définir par programme. 

func setApplicationDefault() {
    let stanDefaults = UserDefaults.standard
    let appDefaults = ["reminder_pref": true]
    stanDefaults.register(defaults: appDefaults)
    stanDefaults.synchronize()
}

Ici, dans mon fichier Root.plist, la valeur par défaut est YES et lorsque viewDidload, je règle cette valeur de préférence sur true. Quand je cours, ça me donne

Valeur par défaut de rappel - true

Et voici à quoi ressemble mon Root.plist.

 enter image description here

J'espère que ça aide.

5
manismku

Par souci de démonstration, supposons que vous ayez deux commutateurs dans le groupe de paramètres. Un avec la valeur par défaut définie à YES et l'autre avec la valeur par défaut définie à NO.

 Settings.bundle content

Si vous voulez pouvoir accéder aux valeurs par défaut définies dans le Settings.bundle à partir de la UserDefaults de votre application, vous devez d'abord les enregistrer. Malheureusement, iOS ne le fera pas pour vous et vous devez vous en occuper vous-même.

La méthode suivante analyse le Root.plist associé au Settings.bundle et enregistre les valeurs par défaut des identifiants de vos préférences.

func registerDefaultsFromSettingsBundle()
{
    let settingsUrl = Bundle.main.url(forResource: "Settings", withExtension: "bundle")!.appendingPathComponent("Root.plist")
    let settingsPlist = NSDictionary(contentsOf:settingsUrl)!
    let preferences = settingsPlist["PreferenceSpecifiers"] as! [NSDictionary]

    var defaultsToRegister = Dictionary<String, Any>()

    for preference in preferences {
        guard let key = preference["Key"] as? String else {
            NSLog("Key not fount")
            continue
        }
        defaultsToRegister[key] = preference["DefaultValue"]
    }
    UserDefaults.standard.register(defaults: defaultsToRegister)
}

Je recommande de l'exécuter le plus tôt possible. Vous serez sûr que les valeurs par défaut sont présentes pour toutes les parties de votre application.

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

    let one = UserDefaults.standard.bool(forKey: "switch_one")
    let two = UserDefaults.standard.bool(forKey: "switch_two")

    NSLog("One: \(one), Two: \(two)")

    return true
}
8

Ajouter une notification pour UserDefaults.didChangeNotification comme ci-dessous:

override func viewDidLoad() {
    super.viewDidLoad()
    registerSettingsBundle()
    NotificationCenter.default.addObserver(self, selector: #selector(updateDisplayFromDefaults), name: UserDefaults.didChangeNotification, object: nil)
    updateDisplayFromDefaults()
}
func registerSettingsBundle(){
    let appDefaults = [String:AnyObject]()
    UserDefaults.standard.register(defaults: appDefaults)
    UserDefaults.standard.synchronize()
}

func updateDisplayFromDefaults(){
    let defaults = UserDefaults.standard
    let update_lot = defaults.bool(forKey: "update_lot")
    print(update_lot)
}
2
Vini App