Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:在打开和关闭应用程序时未保存/加载用户默认值_Ios_Swift_Nsuserdefaults - Fatal编程技术网

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

Ios Swift:在打开和关闭应用程序时未保存/加载用户默认值,ios,swift,nsuserdefaults,Ios,Swift,Nsuserdefaults,我有一个全局设置变量(SettingsVariable.settingOne),该变量在应用程序运行时由用户更改。我想让用户永久更改,但每次重新加载应用程序时,它都会还原为原始值,例如用户将值更改为false,但当应用程序重新运行时,变量值会更改回原始值 更改值时,调用以下代码(swift 2): 当应用程序关闭时: func applicationWillTerminate(application: UIApplication) { // Called when the applica

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

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

当应用程序关闭时:

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

}

您需要给出
同步
以保存
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
只是枚举

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)
}

感谢您的回复,我已将其添加到代码中,但它仍然没有加载更改的值。1)您通常不需要调用
synchronize
。2)
applicationWillTerminate
并不总是被调用。我在applicationIdentinterbackground方法中也有代码,但不起作用。感谢您的回复,我已将其添加到代码中,但它仍然没有加载更改的值。applicationWillTerminate方法仅在我们停止应用程序的多任务处理时才会调用。尝试在“applicationIdentinterbackground”方法中添加保存逻辑。我在applicationWillTerminate和applicationIdentinterbackground方法中都有coe,但在applicationWillTerminate方法中不起作用您正在使用“SettingsVariables.settingOne”值保存在NSUserDefaults中,如果此方法最后调用,然后NSUSerDefaults值将被覆盖。如果NSUSerDefaults中有值,则必须更新设置变量。基于NSUserDefault值设置一个值。我希望这能帮助你。
 func setUserData(value: AnyObject?, key: UserDataKey) -> () {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(value, forKey: key.rawValue)
}