SwiftUI-如何将自定义类数据保存到UserDefaults?

时间:2020-07-18 22:34:06

标签: ios swift iphone swiftui userdefaults

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

如何保存此数据? (在SettingsView中按按钮时)

第一次在这里问。

-MainView ---

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

--- SettingsView ---

import SwiftUI

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

谢谢。

1 个答案:

答案 0 :(得分:0)

为此,您要做的就是确保您的自定义类正在使用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

中了解更多相关信息