I have a DatePicker in mi ContentView.
The App im working for, requires that all the other views, has the same DatePicker, with the exact Date selected in the ContentView page.
Any ideas?
CodePudding user response:
here is the demo code that shows how to pass a Date variable to other views using binding.
If you not not require the other views to change the date,
then use @State var sameDate: Date instead of @Binding var sameDate: Date.
You can also achieve the same with an single ObservableObject and passing it using @EnvironmentObject, see EDIT-1.
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@State var birthDate = Date()
var body: some View {
NavigationView {
VStack (spacing: 80) {
DatePicker(selection: $birthDate, displayedComponents: .date) {
Text("Select a date")
}.padding(.top, 50)
NavigationLink("Next view", destination: NextView1(sameDate: $birthDate))
}
}.navigationViewStyle(.stack)
}
}
struct NextView1: View {
@Binding var sameDate: Date
var body: some View {
VStack (spacing: 80) {
DatePicker(selection: $sameDate, displayedComponents: .date) {
Text("Next view-1 date")
}.padding(.top, 50)
NavigationLink("Next view", destination: NextView2(sameDate: $sameDate))
}
}
}
struct NextView2: View {
@Binding var sameDate: Date
var body: some View {
DatePicker(selection: $sameDate, displayedComponents: .date) {
Text("Next view-2 date")
}.padding(.top, 50)
}
}
EDIT-1: using a ObservableObject.
class DateManager: ObservableObject {
@Published var birthDate = Date()
}
struct ContentView: View {
@StateObject var dateManager = DateManager()
var body: some View {
NavigationView {
VStack (spacing: 80) {
DatePicker(selection: $dateManager.birthDate, displayedComponents: .date) {
Text("Select a date")
}.padding(.top, 50)
NavigationLink("Next view 1", destination: NextView1())
}
}.navigationViewStyle(.stack)
.environmentObject(dateManager)
}
}
struct NextView1: View {
@EnvironmentObject var dateManager: DateManager
var body: some View {
VStack (spacing: 80) {
DatePicker(selection: $dateManager.birthDate, displayedComponents: .date) {
Text("Next view-1 date")
}.padding(.top, 50)
NavigationLink("Next view 2", destination: NextView2())
}
}
}
struct NextView2: View {
@EnvironmentObject var dateManager: DateManager
var body: some View {
DatePicker(selection: $dateManager.birthDate, displayedComponents: .date) {
Text("Next view-2 date")
}.padding(.top, 50)
}
}
