SwiftUI,如何将数据从视图发布到视图模型,然后再发布到第二个视图



我有一个视图(带有Form(、一个viewModel和第二个视图,我希望以第一个视图的Form显示输入。我认为在viewModel中用@Published包装出生日期的属性会拉取Form输入,但到目前为止,我无法获得第二个视图来读取用户在第一个视图的Form中选择的出生日期。

这是我第一次查看的代码:

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

这是我的视图型号代码:

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

这可能并不重要,但这是我的内容视图,我可以在两个视图之间切换:

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

最后一点,我有第二个项目需要这个功能(从视图到视图模型再到视图(,所以跳过视图模型并直接从一个视图转到另一个视图将没有帮助。

非常感谢!!

像使用class AppViewModel: ObservableObject一样使用CCD_;通过";应用程序视图周围的数据。但是,您的代码中存在一些小故障。

在第一个视图(ProfileFormView(中,删除@State var birthdate = Date()并使用DatePicker("Birthdate", selection: $appViewModel.birthdate, ...

还要在第二个视图(UserDataView(中删除@StateObject var vm = AppViewModel(),您已经有了@EnvironmentObject var viewModel: AppViewModel,不需要其中的两个。

@StateObject var vm = AppViewModel()放在视图的层次结构中,并使用带有.environmentObject(vm)

阅读此信息以了解如何管理您的数据:https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app

最新更新