SwiftUI, как публиковать данные из представления в модель представления, а затем во второе представление?
У меня есть одно представление (с формой), модель представления и второе представление, в котором я надеюсь отображать входные данные в форме первого представления. Я думал, что свойство, обертывающее дату рождения с помощью @Published в модели представления, вытянет ввод формы, но пока я не могу заставить второе представление читать дату рождения, которую пользователь выбирает в форме первого представления.
Вот мой код для моего первого представления:
struct ProfileFormView: View {
@EnvironmentObject var appViewModel: AppViewModel
@State var birthdate = Date()
var body: some View {
NavigationView {
Form {
Section(header: Text("Personal Information")) {
DatePicker("Birthdate", selection: $birthdate, displayedComponents: .date)
}
}
}
Вот мой код viewModel:
class AppViewModel: ObservableObject {
@Published var birthdate = Date()
func calcAge(birthdate: String) -> Int {
let dateFormater = DateFormatter()
dateFormater.dateFormat = "MM/dd/yyyy"
let birthdayDate = dateFormater.date(from: birthdate)
let calendar: NSCalendar! = NSCalendar(calendarIdentifier: .gregorian)
let now = Date()
let calcAge = calendar.components(.year, from: birthdayDate!, to: now, options: [])
let age = calcAge.year
return age!
и вот мой второй код просмотра:
struct UserDataView: View {
@EnvironmentObject var viewModel: AppViewModel
@StateObject var vm = AppViewModel()
var body: some View {
VStack {
Text("\(vm.birthdate)")
Text("You are signed in")
Button(action: {
viewModel.signOut()
}, label: {
Text("Sign Out")
.frame(width: 200, height: 50)
.foregroundColor(Color.blue)
})
}
}
И это может не иметь значения, но вот мой contentView, где я могу переключаться между двумя представлениями:
struct ContentView: View {
@EnvironmentObject var viewModel: AppViewModel
var body: some View {
NavigationView {
ZStack {
if viewModel.signedIn {
ZStack {
Color.blue.ignoresSafeArea()
.navigationBarHidden(true)
TabView {
ProfileFormView()
.tabItem {
Image(systemName: "square.and.pencil")
Text("Profile")
}
UserDataView()
.tabItem {
Image(systemName: "house")
Text("Home")
}
}
}
}
else
{
SignInView()
}
}
}
.onAppear {
viewModel.signedIn = viewModel.isSignedIn
}
}
И последнее замечание: у меня есть второй проект, для которого требуется эта функциональность (от просмотра к модели просмотра), поэтому пропуск модели просмотра и переход напрямую от представления к представлению не поможет.
Большое спасибо!!