【问题标题】:Swift: User default values not being saved/ loaded when app is opened and closedSwift:打开和关闭应用程序时未保存/加载用户默认值
【发布时间】:2016-10-20 14:07:55
【问题描述】:

我有一个全局设置变量 (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

}

【问题讨论】:

    标签: ios swift nsuserdefaults


    【解决方案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) 您通常不需要致电synchronize。 2) applicationWillTerminate 并不总是被调用。
    • 我在 applicationDidEnterBackground 方法中也有代码,但不起作用
    • 这个答案是错误的。请看stackoverflow.com/a/40809748/2227743
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复,我已将其添加到代码中,但仍未加载更改的值。
    • applicationWillTerminate 方法只会在我们从多任务中终止应用程序时调用。尝试在“applicationDidEnterBackground”方法中添加保存逻辑。
    • 我在 applicationWillTerminate 和 applicationDidEnterBackground 方法中都有 coe 但不起作用
    • 在 applicationWillTerminate 方法中,您使用“SettingsVariables.settingOne”值保存在 NSUserDefaults 中,如果最后调用此方法,则 NSUSerDefaults 值将被覆盖。
    • 如果您在 NSUserDefaults 中有值,那么您必须根据 NSUserDefault 值更新 SettingsVariables.settingOne 值。我希望这可以帮助你。
    【解决方案3】:

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

    【讨论】:

    • CFPreferencesAppSynchronize 从 iOS 2.0 开始就可用,这不是新闻。而且你也不需要调用它。请大家看看this answer 有很好的解释。
    • @EricAya 谢谢你的建议?
    【解决方案4】:

    这是我用来从 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多