依赖于UserDefaults的视图在更改时不会更新

时间:2020-11-09 06:15:07

标签: ios swift swiftui

所以我有一个可将切换状态和选择器选择记录到UserDefaults中的类

import Foundation
import Combine

class UserSettings: ObservableObject {
    @Published var shouldSort: Bool {
        didSet {
            UserDefaults.standard.set(shouldSort, forKey: "shouldSort")
        }
    }
    
    @Published var sortKey: String {
        didSet {
            UserDefaults.standard.set(sortKey, forKey: "sortKey")
        }
    }
    
    public var sortKeys = ["alphabetical", "length", "newest", "oldest"]
    
    init() {
        self.shouldSort = UserDefaults.standard.object(forKey: "shouldSort") as? Bool ?? true
        self.sortKey = UserDefaults.standard.object(forKey: "sortKey") as? String ?? "Name"
    }
}

在我的设置页面上,我使用以下代码

@ObservedObject var userSettings = UserSettings()

...

Toggle(isOn: $userSettings.shouldSort, label: {Text("Sort Books")})

Picker(selection: $userSettings.sortKey, label: Text("Sort By"), content: {
                            ForEach(userSettings.sortKeys, id: \.self){ key in
                                Text(key)
                            }
                        })

此代码可以很好地更改值,因为如果我关闭并打开该应用程序,则视图将根据数据进行更新。我正在用

读取数据
@State var sorted =  UserDefaults.standard.bool(forKey: "shouldSort")
@State var sort =  UserDefaults.standard.string(forKey: "sortKey")

在我的内容视图中。 (shouldSort调用一个函数进行排序,如果为true,则sortKey确定数据的排序方式)

我是否使用@State变量读取了错误的数据(@State甚至可以检测到UserDefaults状态的变化)吗?

1 个答案:

答案 0 :(得分:1)

忘记所有您在UIKit中学习到的有关UserDefaults的知识,并向SwiftUI中的AppStorage说声招呼,请使用以下代码:

@AppStorage("shouldSort") var sorted: Bool = false
@AppStorage("sortKey") var sort: String = ""