我应该如何获取并设置UserDefaults的值?

问题描述

我目前正在使用SwiftUI开发应用程序。

我想在此应用中使用UserDefaults值。 所以我在下面做了一个代码

但是在这种情况下,当我重新启动应用程序(以下过程中的第4个过程)时,我无法从UserDefaults中获取价值...

  1. 构建并运行该项目。

  2. 取消主屏幕按钮,应用程序将进入后台

  3. 双击“主页”按钮,然后删除应用程序屏幕。

  4. 按应用程序图标,然后重新启动应用程序。然后我想从UserDefaults中获取价值。

enter image description here

解决此问题,应如何在UserDefaults中设置和获取值?


代码如下:

import SwiftUI

struct ContentView: View {
    
    @State var text = "initialText"
    
    var body: some View {
        vstack {
            Text(text)
            TextField( "",text: $text)
        }.onAppear(){
            if let text = UserDefaults.standard.object(forKey: "text" ){
                self.text = text as! String
            }
        }
        .ondisappear(){
            UserDefaults.standard.set(self.text,forKey: "text")
        }
    }
}

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

添加

当我在第一个答案之后添加此类时,该代码有几个这样的错误,这很常见吗?

enter image description here


Xcode:版本11.7

Swift:Swift 5

解决方法

在这样的类中设置您的值:布尔,字符串(请参见示例),整数等...

#if os(iOS)
import UIKit
#else
import AppKit
#endif

import Combine

@propertyWrapper struct UserDefault<T> {

   let key: String
   let defaultValue: T

   init(_ key: String,defaultValue: T) {
       self.key = key
       self.defaultValue = defaultValue
   }

   var wrappedValue: T {
       get {
           return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
       }
       set {
           UserDefaults.standard.set(newValue,forKey: key)
       }
   }
}

final class UserSettings: ObservableObject {

   let objectWillChange = PassthroughSubject<Void,Never>()

   @UserDefault("myText",defaultValue: "initialText")
   var myText: String {
       willSet { objectWillChange.send() }
   }

}

要阅读的内容:

let settings = UserSettings()
let count = settings.countSentence // default countsentence 1

此更新:

let settings = UserSettings()
settings.countSentence = 3 // default countsentence 3

根据您的代码:

struct ContentView: View {

let UserDef = UserSettings()
@State var text = ""

var body: some View {
    VStack {
        Text(UserDef.myText)
        TextField("placeholder",text: $text,onCommit: { self.UserDef.myText = self.text})
    }.onAppear() {
        self.text = self.UserDef.myText
    }
}
}