【问题标题】:Save String from more than 1 TextField in UserDefaults with SwiftUI使用 SwiftUI 在 UserDefaults 中保存超过 1 个 TextField 的字符串
【发布时间】:2020-06-02 21:04:52
【问题描述】:

我不知道如何为超过 1 个文本字段保存 userData。

我设法保存了 1 个文本字段的数据,但如果我“复制”代码和文本字段,它只会保存一个文本字段 userData...

我的用户数据文件:

import SwiftUI
import Combine

class UserData : ObservableObject {

 private static let userDefaultBuyingPrice = "BuyingPrice"
 private static let userDefaultRent = "Rent"


 @Published var BuyingPrice = UserDefaults.standard.string(forKey: UserData.userDefaultBuyingPrice) ?? ""

  @Published var Rent = UserDefaults.standard.string(forKey: UserData.userDefaultRent) ?? ""
  private var canc: AnyCancellable!

 }

我的 ContentView 文件:

struct ContentView: View {

@ObservedObject var userData = UserData()

var body: some View {
    VStack{
        TextField("BuyingPrice", text: $userData.BuyingPrice)
            .font(.title)
            .keyboardType(.decimalPad)

        TextField("Rent", text: $userData.Rent)
            .font(.title)
            .keyboardType(.decimalPad)
    }
}

}

Only the second value is saved, cannot figure out why the second one is not working

如果有一个更简单的解决方案来保存整个 userData,我将不胜感激。

谢谢,

【问题讨论】:

标签: ios swiftui settings user-data userdefaults


【解决方案1】:

用户数据:

import SwiftUI
import Combine

class UserData : ObservableObject {

  private static let userDefaultBuyingPrice = "BuyingPrice"
  private static let userDefaultRent = "Rent"


  @Published var BuyingPrice = UserDefaults.standard.string(forKey: UserData.userDefaultBuyingPrice) ?? "" {
    didSet {
      UserDefaults.standard.set(self.BuyingPrice, forKey: UserData.userDefaultBuyingPrice)
    }
  }

  @Published var Rent = UserDefaults.standard.string(forKey: UserData.userDefaultRent) ?? "" {
    didSet {
      UserDefaults.standard.set(self.Rent, forKey: UserData.userDefaultRent)
    }
  }
  private var canc: AnyCancellable!

}

内容视图:

import SwiftUI

struct ContentView: View {
  @EnvironmentObject var userData: UserData

   var body: some View {
       VStack{
           TextField("BuyingPrice", text: $userData.BuyingPrice)
               .font(.title)
               .keyboardType(.decimalPad)

           TextField("Rent", text: $userData.Rent)
               .font(.title)
               .keyboardType(.decimalPad)
       }
   }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
      ContentView().environmentObject(UserData())
    }
}

在 SceneDelegate.swift 中:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

  var window: UIWindow?
  var userData = UserData() //add this line

//then modify this  line:
window.rootViewController = UIHostingController(rootView: contentView)
//to this:
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(userData))

【讨论】:

  • 这个问题困扰了几天,终于解决了。我也忘记了整个“SceneDelegate Part”。非常感谢。
猜你喜欢
  • 2020-01-22
  • 2020-07-21
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多