我有一个视图(带有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