【问题标题】:SwiftUI - How to save custom class data to UserDefaults?SwiftUI - 如何将自定义类数据保存到 UserDefaults?
【发布时间】:2020-11-08 11:14:58
【问题描述】:

我创建了一个自定义类(作为 ObservedObject,因为我需要共享这些数据)。 一切正常,但是当我强制关闭应用程序时,数据会重置,我还没有找到任何方法将其保存到 UserDefaults。 (试图正常保存为对象导致应用程序崩溃)。

如何保存这些数据? (在 SettingsView 中按下按钮时)

第一次在这里问。

---主视图---

import SwiftUI

class ProgressData:  ObservableObject {
    @Published var licenseDate: Date = Date()
    @Published var dayProgressValue: Float = 0.00
    @Published var nightProgressValue: Float = 0.00
    @Published var newDriverProgressValue: Float = 0.00
}

struct MainView: View {
    let defualts = UserDefaults.standard
    @ObservedObject var data = ProgressData()
    
    var body: some View {
       // App Code Here!
    }

--- 设置视图 ---

import SwiftUI

struct SettingsView: View {
    @ObservedObject var data: ProgressData
    
    
    var body: some View {
         Button(action: {
            // What to do in order to save it here?
         })
    }

谢谢。

【问题讨论】:

  • “我怎么能”的范围很广。这是一项简单的任务,尤其是在 Xcode 12 beta 中,值基本上可以自我保存。你有什么问题?保存到用户默认值已在此处多次解释。你搜索了吗?您可以通过使对象符合 Codable 来保存任意对象的属性;这对您的 ProgressData 来说是微不足道的。例如,请参阅stackoverflow.com/questions/44876420/…
  • 您好,感谢您的回答。目前我不知道保存课程的最佳方法是什么,但我对用户默认设置有一些经验,所以我会尝试你的建议。自己找不到...

标签: ios swift iphone swiftui userdefaults


【解决方案1】:

为此,您所要做的就是确保您的自定义类符合Codable 协议。

class ProgressData:  ObservableObject, Codable {
    @Published var licenseDate: Date = Date()
    @Published var dayProgressValue: Float = 0.00
    @Published var nightProgressValue: Float = 0.00
    @Published var newDriverProgressValue: Float = 0.00
}

接下来,您需要像这样将其保存到 UserDefault:

import SwiftUI

struct SettingsView: View {
    @ObservedObject var data: ProgressData

    var body: some View {

        Button(action: {
            let encoder = JSONEncoder()
            if let encoded = try? encoder.encode(data) {
                UserDefaults.standard.set(encoded, forKey: "saved_data")
            }
        })

    }

}

当您想从 UserDefaults 中提取已保存的数据时,您只需这样做:

if let data = defaults.object(forKey: "saved_data") as? Data {
    let decoder = JSONDecoder()
    if let savedData = try? decoder.decode(ProgressData.self, from: data) {
        // Do wantever you want with `savedData`
    }
}

您可以在wonderful article 中阅读更多相关信息

【讨论】:

  • 您好,感谢您的回答。似乎 @Published 无法编码或解码。尝试过没有错误。
猜你喜欢
  • 2022-01-18
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多