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

时间:2016-10-20 14:07:56

标签: ios swift nsuserdefaults

我有一个全局设置变量(SettingsVariable.settingOne),在应用运行时期间由用户更改。我希望让用户永久更改,但是每次重新加载应用时,它都会恢复原始值,例如user将值更改为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包含在struct:

import UIKit

struct SettingsVariables {

    static var settingOne = true

}

4 个答案:

答案 0 :(得分:1)

您需要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()
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

这用于从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)
}