Как использовать UserDefault для массива в SwiftUI - PullRequest
1 голос
/ 27 марта 2020

Я работаю над приложением с контрольным списком, в котором есть несколько массивов с чеками. Я хотел бы сохранить состояние, если пользователи закрывают / выходят из приложения. Я думал об использовании методов UserDefault для этого:

HStack {
          ForEach(0 ..< checklist.steps) { index in
               VStack {
                    Button(action: {
                          self.checked[index].toggle()
                          UserDefaults.standard.set(self.checked[index], forKey: "Check")

В настоящее время я использую следующее состояние для проверок:

 @State private var checked = [false, false, false, false, false, false]

Кто-нибудь знает, как применить UserDefaults для массивов или вообще как сохранить состояние вашего приложения при его закрытии? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

попробуйте это: (это код из прошлого времени;)) я думаю, что истинные / ложные настройки не верны, но сохранение / загрузка работает;)

struct ChecklistView: View {
    var checklist: Checklist
    @State var currentProgress: Float = 0.0
    @State var checked : [Bool] = [false, false, false, false]

    init(checklist: Checklist) {
        self.checklist = checklist

    }

    func saveUserDefaults() {

        var value = ""

        for eachValue in checked {
            if eachValue == true { value += "1" }
            else { value += "0" }
        }

        UserDefaults.standard.set(value, forKey: checklist.title)
    }

    var body: some View {
        ZStack(alignment: .leading) {

            //            RoundedRectangle(cornerRadius: 20)
            //                .foregroundColor(.red).opacity(0.5)
            //                .frame(width: 200)

            VStack {
                HStack(alignment: .top) {
                    checklist.image
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: 40, height: 40)
                        .padding(.trailing)
                    VStack(alignment: .leading) {
                        Text(checklist.title)
                            .font(.system(size: 16, weight: .medium))
                            .padding(.bottom, 4)

                        Text(checklist.instruction.uppercased()).font(.system(size: 12))

                        HStack {
                            ForEach(0 ..< checklist.steps) { index in
                                VStack {
                                    Button(action: {
                                        self.checked[index].toggle()
                                        print(self.checked)
                                        self.saveUserDefaults()

                                    }) {
                                        ZStack {

                                            RoundedRectangle(cornerRadius: 8)
                                                .foregroundColor(self.checked[index] ? Color("LightGreen") : .gray )
                                                .frame(width: 40, height: 40)

                                            Image(systemName: self.checked[index] ?  "checkmark" : "plus")
                                                .resizable()
                                                .aspectRatio(contentMode: .fit)
                                                .frame(width: 16, height: 16)
                                                .foregroundColor(self.checked[index] ? .white : .white)

                                        }
                                    }
                                }
                            }
                        }
                    }
                }.frame(width: 350, alignment: .leading)
            }
        }
        .onAppear() {
            if let values = UserDefaults.standard.value(forKey: self.checklist.title) as? String {

                self.checked = values.map {
                    if $0 == "1" { return true }
                    return false
                }
            }
            print(self.checked)
        }
        .frame(width: 350)
        .padding(.bottom, 16)
        .cornerRadius(8)
        .padding(.top, 20)
    }
}
0 голосов
/ 27 марта 2020

Я не тестировал это решение, но разве вы не можете хранить свой массив в NSUserdefaults после каждого действия кнопки?

Button(action: {
    self.checked[index].toggle()
    UserDefaults.standard.set(self.checked, forKey: "Check")

Вероятно, лучшим решением было бы использовать CoreData для этого, что было бы очень легко использовать.

PS: я могу проверить это решение позже .. не у моего Ма c прямо сейчас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...