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
    }
}

И последнее замечание: у меня есть второй проект, для которого требуется эта функциональность (от просмотра к модели просмотра), поэтому пропуск модели просмотра и переход напрямую от представления к представлению не поможет.

Большое спасибо!!

0 ответов

Другие вопросы по тегам