SwiftUI-如何保存设置选择

时间:2019-11-12 11:39:11

标签: swiftui

import SwiftUI

struct CardTheme: View {
    //@State private var theme = 0
    @State private var theme = UserDefaults.standard.integer(forKey: "Card Theme")

      var body: some View {
        List {
          HStack {
            Text("Mono")
              //.font(.system(size: 12))
              .onTapGesture {
                self.setTheme(i: 0)
            }

            Spacer()

            if(theme == 0) {
              Image(systemName: "checkmark")
                .foregroundColor(Color.green)
            }

          }

          HStack {
            Text("Cool")
             // .font(.system(size: 12))
              .onTapGesture {
                self.setTheme(i: 1)
            }
            Spacer()

            if(theme == 1) {
              Image(systemName: "checkmark")
                .foregroundColor(Color.green)
            }
          }

          HStack {
            Text("Cute")
             // .font(.system(size: 12))
              .onTapGesture {
                self.setTheme(i: 2)
            }
            Spacer()

            if(theme == 2) {
              Image(systemName: "checkmark")
                .foregroundColor(Color.green)
            }
          }
        }
        .navigationBarTitle(Text(verbatim: "Card Theme"))
      }

    func setTheme(i: Int) {
      theme = i
      UserDefaults.standard.set(i, forKey: "Card Theme")
    }
}

我有一个设置菜单,用户可以在其中选择一个主题,默认值设置为全局变量globalVarTheme,该值为0。但是在选择之后,退出该菜单,然后重新进入菜单返回0(第一项),即使他们选择了其他一项。如何保存他们的选择?

此外,在当前应用会话之外保存用户选择的最佳方法是什么?我应该将所有选择都写到plist文件中还是有常规方法?

2 个答案:

答案 0 :(得分:0)

@State用于给定视图中的更改。这并不意味着在所有视图中都存在。而是使用@Environment属性包装器。 WWDC 2019讨论何时使用什么。

答案 1 :(得分:0)

@State不是正确的PropertyWrapper。

如果要在多个视图中使用设置,请使用@EnvironmentObject作为PropertyWrapper。

您可以在此处了解不同的PropertyWrappers: https://medium.com/@alex.hsieh/state-objectbinding-and-environmentobject-in-swiftui-783588b60671

如果要将设置保存到当前应用会话之外,可以使用UserDefauls。 How do I use UserDefaults with SwiftUI?