Swift:打开和关闭应用程序时未保存/加载用户默认值

Swift: User default values not being saved/ loaded when app is opened and closed

我有一个全局设置变量 (SettingsVariable.settingOne),它在应用程序运行时由用户更改。我想让用户永久更改,但目前每次重新加载应用程序时,它都会恢复为原始值,例如用户将值更改为 false,但随后当应用重新运行时,变量值变回原始值。

更改值时调用以下代码 (swift 2):

NSUserDefaults.standardUserDefaults().setBool(false, forKey: "settingOne")

当应用程序关闭时:

func applicationWillTerminate(application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    NSUserDefaults.standardUserDefaults().setBool(SettingsVariables.settingOne, forKey: "settingOne")
}

然后一旦再次打开该应用程序:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

        NSUserDefaults.standardUserDefaults().boolForKey("settingOne")

        return true
}

但是 settingOne 的值不断恢复到应用程序最初设置的默认值 'true'。

SettingsVariables.settingOne 包含在结构中:

import UIKit

struct SettingsVariables {

    static var settingOne = true

}

您需要提供 synchronize 才能保存 NSUserDefaults

所以你的代码必须是

func applicationWillTerminate(application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    NSUserDefaults.standardUserDefaults().setBool(SettingsVariables.settingOne, forKey: "settingOne")
    NSUserDefaults.standardUserDefaults().synchronize()
}

您必须同步值 NSUserDefaults.standardUserDefaults().synchronize()

这是我用来从 NSUserDefaults 获取元素的东西,UserDataKey 只是 Enum

func userDataForKey(key: UserDataKey) -> String? {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    if let value: AnyObject = userDefaults.objectForKey(key.rawValue) {
        return value as? String
    } else {
        return nil
    }
}

这是为了节省

 func setUserData(value: AnyObject?, key: UserDataKey) -> () {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(value, forKey: key.rawValue)
}

现在 Apple 文档建议使用 CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication) 而不是调用 UserDefaults.standard.synchronize(),后者被标记为已弃用的方法。