立即加载 UserDefaults(应用存储)
Posted
技术标签:
【中文标题】立即加载 UserDefaults(应用存储)【英文标题】:Immediate loading of UserDefaults (App Storage) 【发布时间】:2020-12-31 15:08:59 【问题描述】:我在 SwiftUI 中通过 UserDefaults (App Storage) 保存整数,但现在的问题是,在不同的结构中,整数仅在重新启动应用程序后加载,但当您单击导航链接时,整数应该立即加载视图来了。整数(通过 if 查询以文本的形式)立即加载到相同的结构中。
如果有人可以帮助我,我很高兴。
提前谢谢你:)
演示代码:
import SwiftUI
struct Monday1BCalendarView: View
@AppStorage("Monday1B") var Monday1B: Int = 1
var body: some View
Form
Section(header: Text("Main"))
Button(action:
self.Montag1B = 0;
, label:
Text("Maths")
.foregroundColor(.primary)
)
并加载:
import SwiftUI
struct CalendarMainView: View
var Monday1B: Int = UserDefaults.standard.integer(forKey: "Monday1B")
var body: some View
NavigationView
VStack
ZStack
Image("Stundenplan")
.resizable()
.frame(width: 360, height: 200, alignment: .center)
.position(x: 200, y: 100)
if Montag1B == 0
Text("Mathe")
【问题讨论】:
你会为某个问题添加演示代码吗? 您需要对变量使用 '@AppStorage....' 包装器。 好的,这个怎么用? 【参考方案1】:这行在初始化时只会从UserDefaults
读取:
struct CalendarMainView: View
var Monday1B: Int = UserDefaults.standard.integer(forKey: "Monday1B")
如果你想观察这个值的变化,你需要@AppStorage
:
struct CalendarMainView: View
@AppStorage("Monday1B") var Monday1B: Int = 1
...
如果您最终拥有多个 @AppStorage
包装器,您可以在父视图中创建一个并将其传递给子视图。
【讨论】:
谢谢,我是 Swift 初学者,抱歉我的问题很糟糕。另外,我来自德国,很抱歉我的英语不好。 @LeoSaischowa 如果我的回答解决了您的问题,请接受。见What should I do when someone answers my question?【参考方案2】:你必须在两个(所有)地方都使用@AppStorage
struct CalendarMainView: View
// this automatically updated
@AppStorage("Montag1B") var Montag1B: Int = 0
// this read only once - on initialization
//var Montag1B = UserDefaults.standard.integer(forKey: "Montag1B")
【讨论】:
以上是关于立即加载 UserDefaults(应用存储)的主要内容,如果未能解决你的问题,请参考以下文章
UserDefaults removeObjectForKey 不起作用?
您是不是能够跨不同的视图控制器/.swift 文件检索存储在 UserDefaults 中的数据?
如何在 Xcode 中终止并重新打开应用程序后检查 UserDefaults (swift)