gpt4 book ai didi

swift - 如何让@AppStorage 在 MVVM/SwiftUI 框架中工作?

转载 作者:行者123 更新时间:2023-12-05 08:04:52 25 4
gpt4 key购买 nike

我的整个应用程序都有一个 SettingsManager 单例,它包含大量用户设置。我有几个 ViewModel 可以引用并可以编辑 SettingsManager

应用程序基本上是这样的......

import PlaygroundSupport
import Combine
import SwiftUI

class SettingsManager: ObservableObject {
static let shared = SettingsManager()

@AppStorage("COUNT") var count = 10
}

class ViewModel: ObservableObject {
@Published var settings = SettingsManager.shared

func plus1() {
settings.count += 1
objectWillChange.send()
}
}

struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack {
Button(action: viewModel.plus1) {
Text("\(viewModel.settings.count)")
}
}
}
}

let viewController = UIHostingController(rootView: ContentView())

PlaygroundPage.current.liveView = viewController

令人沮丧的是,它在大约 85% 的时间内都有效。但有 15% 的时间,值不会更新,直到离开 View 然后返回。

如何让@AppStorage 与我的 View Model/MVVM 框架配合得很好?!

最佳答案

在研究这个确切问题时遇到了这个问题。我倾向于让 SwiftUI 为我完成繁重的工作。例如:

// Use this in any view model you need to update the value
extension UserDefaults {
static func setAwesomeValue(with value: Int) {
UserDefaults.standard.set(value, forKey: "awesomeValue")
}

static func getAwesomeValue() -> Int {
return UserDefaults.standard.bool(forKey: "awesomeValue")
}
}

// In any view you need this value
struct CouldBeAnyView: some View {
@AppStorage("awesomeValue") var awesomeValue = 0
}

AppStorage 只是 UserDefaults 的包装器。每当 View 模型更新“awesomeValue”的值时,AppStorage 都会自动获取它。重要的是在声明@AppStorage 时传递相同的 key 。可能不应该使用字符串文字,但常量会更容易跟踪吗?

关于swift - 如何让@AppStorage 在 MVVM/SwiftUI 框架中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67203284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com