如何在 SwiftUI 中自动将值从一个视图发布到另一个视图?

时间:2021-01-06 17:37:45

标签: swiftui

目前,我有一个带有日期选择器的视图,可以设置首选时间。我有一个 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")
        }
    }
}

1 个答案:

答案 0 :(得分:1)

不清楚您的观点是如何结合在一起的。如果 SettingsDetailViewSettingsDetailView 显示,那么您应该通过构造函数传递用户数据,例如

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)

     // ...
   }
}