目前,我有一个带有日期选择器的视图,可以设置首选时间。我有一个 UserData 文件,它将首选时间存储在用户默认值中,最后,我有第二个视图,将首选时间显示为字符串。
这是我的问题:首选时间在用户默认设置中正确设置,但不会自动反映在第二个视图中。当我点击“返回”时,显示的时间不会改变。但是,当我退出应用程序并返回时,会反映新的时间。
如何自动同步这两个视图?
视图 1(使用日期选择器):
import SwiftUI
import UserNotifications
struct SettingsDetailView: View {
@ObservedObject var userData = UserData()
var body: some View {
VStack (alignment: .center, spacing: 0) {
//MARK - FORM
Form{
DatePicker("Select a new time", selection: $userData.wakeUpTime, displayedComponents: .hourAndMinute)
}
}
}
}
视图 2(应自动显示首选时间)
import SwiftUI
import UserNotifications
struct SettingsView: View {
@ObservedObject var userData = UserData()
static var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "hh:mm a"
return formatter
}()
var body: some View {
NavigationView {
VStack (alignment: .center, spacing: 0) {
Form{
Section(header: Text("NOTIFICATION SETTINGS")) {
HStack {
Text("Current Notification Time")
.foregroundColor(Color("MainText"))
Spacer()
Text("\(self.userData.wakeUpTime, formatter: SettingsView.self.dateFormatter)")
}
}
}
}
}
}
}
和用户数据:
import Foundation
import SwiftUI
class UserData: ObservableObject {
@Published var wakeUpTime: Date = UserDefaults.standard.object(forKey: "wakeUpTime") as? Date ?? Date() {
didSet {
UserDefaults.standard.set(self.wakeUpTime, forKey: "wakeUpTime")
}
}
}
答案 0 :(得分:1)
不清楚您的观点是如何结合在一起的。如果 SettingsDetailView
从 SettingsDetailView
显示,那么您应该通过构造函数传递用户数据,例如
struct SettingsDetailView: View {
@ObservedObject var userData: UserData // << declared to be injected
// ...
}
在里面的某个地方
struct SettingsView: View {
@ObservedObject var userData = UserData()
static var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "hh:mm a"
return formatter
}()
var body: some View {
// ...
SettingsDetailView(userData: self.userData)
// ...
}
}