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

Posted

技术标签:

【中文标题】我应该如何获取和设置 UserDefaults 的值?【英文标题】:How should I get and set a value of UserDefaults? 【发布时间】:2020-09-08 11:08:25 【问题描述】:

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

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

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

    构建并运行此项目。

    按下主页按钮,应用程序进入后台。

    双击主页按钮并移除应用屏幕。

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

要解决这个问题,我应该如何在 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()
    


添加

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


Xcode:版本 11.7

斯威夫特:斯威夫特 5

【问题讨论】:

检查一下,***.com/questions/56822195/… 你的 ios 版本目标是什么?也许值得一提的是,如果您准备等待 Xcode 12 和 iOS 14 的发布,您可以使用 SwiftUI @AppStorage 属性包装器 - 非常易于使用并且只需要很少的代码。 @andrewbuilder,感谢您的评论,本项目的目标是 ios 13.7 【参考方案1】:

在这样的类中设置您的值:Bool、String(参见示例)、Int 等...

#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
    


【讨论】:

感谢您的帮助,当我添加 UserSettings 类时,代码有几个错误,就像我附上的照片一样,这是正常的吗? 感谢您的大力支持!现在效果很好。

以上是关于我应该如何获取和设置 UserDefaults 的值?的主要内容,如果未能解决你的问题,请参考以下文章

在 UserDefaults 中设置对象数组

UserDefaults 如何获取自己保存的密钥?

设置 nil UserDefaults 时出现 NSInvalidArgumentException

获取 UserDefaults 以保留自定义数据类型

如何解决 myModel 变量中的 UserDefaults 设置错误?

SwiftUI 从 UserDefaults.standard 存储和提取字典