如何在SwiftUI中将视图属性绑定到ViewModel属性

7cjasjjr  于 2023-11-16  发布在  Swift
关注(0)|答案(2)|浏览(195)

我很难弄清楚如何关闭在SwiftUI中全屏显示的视图。
在登录页面上,有一个点击重置密码选项。当用户点击那里时,会出现另一个视图。新视图的ViewModel与SignInView的ViewModel不同。
在执行了一个重置密码的异步操作后,我想关闭重置密码视图并返回到SignInView。一个缩写版本如下所示:

  1. // SignInView
  2. @State var isActive = false
  3. var body: some View {
  4. Text("Forgot Password? Tap to reset")
  5. .onTapGesture {
  6. isActive = true
  7. }
  8. .fullScreenCover(isPresented: $isActive, content: {
  9. ResetPasswordView(viewModel: ResetPasswordViewModel(), isActive: $isActive)
  10. })
  11. }
  12. // ResetPasswordView
  13. @ObservedObject var viewModel: ResetPasswordViewModel
  14. @Binding var isActive: Bool
  15. init(viewModel: ResetPasswordViewModel, isActive: Binding<Bool>) {
  16. self.viewModel = viewModel
  17. self._isActive = isActive
  18. }
  19. var body: some View {
  20. Button(action: {
  21. viewModel.resetPassword()
  22. }, label: {
  23. Text("Done")
  24. })
  25. }

字符串
由于异步密码重置操作发生在ResetPasswordView的ViewModel中,因此我希望能够在完成后将isActive设置为false并关闭ResetPasswordView。但我不知道如何从ViewModel更改isActive,因为它直接传递到视图。
我对MVVM非常陌生,不确定我是否正确地考虑了这一点。

tcomlyy6

tcomlyy61#

您已经正确绑定了isActive。现在只需将其设置为false
你所需要的是在适当的地方:

  1. isActive = false

字符串
一种方法是让ViewModel直接处理isActive

解决方案

  1. class ResetPasswordViewModel: ObservableObject {
  2. @Binding var isActive: Bool
  3. //...other viewModel variables
  4. init(/*...your other params*/ isActive: Binding<Bool>) {
  5. self._isActive = isActive
  6. }
  7. func resetPassword() {
  8. //...your logic
  9. isActive = false
  10. }
  11. }

示例(使用中):

  1. struct ContentView: View {
  2. @State var isActive = false
  3. var body: some View {
  4. Text("Forgot Password? Tap to reset")
  5. .onTapGesture { isActive = true }
  6. .fullScreenCover(isPresented: $isActive,
  7. content: {
  8. ResetPasswordView(viewModel: ResetPasswordViewModel(isActive: $isActive))
  9. })
  10. }
  11. }
  12. struct ResetPasswordView: View {
  13. @ObservedObject var viewModel: ResetPasswordViewModel
  14. var body: some View {
  15. Button(action: {
  16. viewModel.resetPassword()
  17. }, label: {
  18. Text("Done")
  19. })
  20. }
  21. }

展开查看全部
l2osamch

l2osamch2#

不要将视图的属性绑定到视图模型,视图模型应该管理视图的所有属性状态以发布到视图。

  1. // SignInView
  2. @ObservedObject var viewModel = CurrentPageViewModel()
  3. var body: some View {
  4. Text("Forgot Password? Tap to reset")
  5. .onTapGesture {
  6. viewModel.push()
  7. }
  8. .fullScreenCover(isPresented: $viewModel.isActive, content: {
  9. ResetPasswordView()
  10. })
  11. }
  12. class CurrentPageViewModel: ObservableObject {
  13. @Published var isActive: Bool = false
  14. func push() {
  15. isActive = true
  16. }
  17. }

字符串

展开查看全部

相关问题