【问题标题】:UserDefaults not saving when used in a frameworkUserDefaults 在框架中使用时不保存
【发布时间】:2020-01-30 11:12:19
【问题描述】:

我有一个需要在本地保存值的框架,为此我选择了 UserDefaults。

但是,这些值永远不会保存,并且以下读取函数在重新启动应用后总是返回""

class Preferences {
    let preferences : UserDefaults

    init (preferences : UserDefaults) {
        self.preferences = preferences
    }

    // Private Key
    func savePrivateKey(key : String) {
        writeString(value: key, key: privateKeyKey)
    }

    func readPrivateKey() -> String! {
        return readString(key: privateKeyKey)
    }

    private func readString(key : String) -> String? {
        if preferences.object(forKey: key) == nil {
            return "bananas"
        } else {
            return preferences.string(forKey: key)
        }
    }

    private func writeString(value : String, key : String) {
        preferences.set(value, forKey: key)
    }

    fileprivate let privateKeyKey = "privateKey"
}

初始化为:

let preferences = Preferences(preferences: UserDefaults.standard)

我试过了:

  • 模拟器和物理设备
  • 调试和发布
  • UserDefaults 和 SwiftyUserDefaults

奇怪的是,这是保存 Bool 值,而不是字符串值。

我认为这可能是由于没有正确使用UserDefaults,但SwiftyUserDefaults 得到了相同的结果。

【问题讨论】:

  • 您是否尝试过显式同步? (即写完后打电话preferences.synchronize()?你应该试一试。
  • 是的,这已被弃用,-synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.
  • @CZ54 我以前见过,但不是在我想要 SDK 的默认值的情况下使用吗?就我而言,当 SDK 启动时,我们没有存储任何值,也没有默认值,所以我认为这不是方法
  • @Vanethos 您希望在您的应用程序和框架之间共享价值?

标签: ios swift userdefaults swiftyuserdefaults


【解决方案1】:
import Foundation

public class AppDefaults {
    private let defaultStringKey = "DefaultString"
}

public extension AppDefaults {

    var defaultString: String? {
        get { return UserDefaults.standard.string(forKey: defaultStringKey) }
        set { UserDefaults.standard.set(newValue?.description, forKey: defaultStringKey) }
    }

}

我建议您创建一个单独的文件,称为 AppDefaults 等。然后您可以访问每个默认值

var text = AppDefaults().defaultString

然后你可以覆盖它,它会自动保存使用

AppDefaults().defaultString = "Bananas"

【讨论】:

  • 这不是问题,问题是没有正确保存首选项,所以每次我使用UserDefaults.standard.string 它总是给出"" 作为值,即使我设置默认为bananas
  • @Vanethos 您是否尝试过设置并尝试使用我上面显示的方法读取 UserDefaults?从您显示的内容来看,首选项没有被初始化。您可能需要显示完整的代码以查看发生了什么。上面的实现看起来更简洁。
  • @Vanethos 我测试了你更新的代码并做了一个 print(Preferences(preferences: UserDefaults.standard).readPrivateKey()) 并且我得到了 Optional("bananas") 肯定有其他影响这个。 .
  • 如问题所述,此代码用于框架中。这是一个问题吗? @HJ戴维斯
  • 框架默认使用“香蕉”?哈哈。出于好奇,这是什么框架。如果这不起作用,我建议使用您自己的实现来处理用户默认值,除非它需要使用框架。
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多