首页 > 解决方案 > 为什么 ViewModel 函数在 SwiftUI 中抛出错误?

问题描述

我试图在视图中调用 ViewModel 方法,但收到错误为Thread 1: Fatal error: No ObservableObject of type AuthViewModel found。AuthViewModel 的 View.environmentObject(_:) 作为该视图的祖先可能会丢失。我不知道为什么会这样。

授权视图模型

import SwiftUI

class AuthViewModel: ObservableObject {
  func login() {
    print("Hello")
  }
}

我的查看文件

//
//  RegistrationView.swift
//  TwitterSwiftUI
//
//  Created by developer on 11/06/21.
//

import SwiftUI

struct RegistrationView: View {
  @State var text = ""
  @State var fullName = ""
  @State var userName = ""
  @State var password = ""
  @State var isImagePickerDisplay = false
  @State var selectedImage:UIImage?
  
  @Environment(\.presentationMode) var mode: Binding<PresentationMode>
  
  @EnvironmentObject var viewModel: AuthViewModel
    var body: some View {

      ZStack {
        Color(#colorLiteral(red: 0.2203325033, green: 0.6315936446, blue: 0.955042541, alpha: 1))
          .ignoresSafeArea()
        VStack {
          
          Button(action: {
            isImagePickerDisplay = true
          }, label: {
            
            if selectedImage != nil {
                Image(uiImage: selectedImage!)
                .resizable()
                .scaledToFit()
                .frame(width: 140, height: 140)
                .padding(.top, 0)
            } else {
              Image("plus_photo")
                .resizable()
                .renderingMode(/*@START_MENU_TOKEN@*/.template/*@END_MENU_TOKEN@*/)
                .foregroundColor(.white)
                .scaledToFit()
                .frame(width: 140, height: 140)
                .padding(.top, 0)
            }

            
            
          })
          
          
          
          VStack {
            CustomTextField(text: $fullName, placeholder: Text("Full name"), icon: Image(systemName: "person"))
              .foregroundColor(.white)
              .padding()
              .background(Color(.init(white: 1, alpha: 0.15)))
              .cornerRadius(10)
            
            CustomTextField(text: $fullName, placeholder: Text("Email"), icon: Image(systemName: "envelope"))
              .foregroundColor(.white)
              .padding()
              .background(Color(.init(white: 1, alpha: 0.15)))
              .cornerRadius(10)
            
            CustomTextField(text: $userName, placeholder: Text("Username"), icon: Image(systemName: "person"))
              .foregroundColor(.white)
              .padding()
              .background(Color(.init(white: 1, alpha: 0.15)))
              .cornerRadius(10)
            
            CustomSecureField(password: $password)
              .foregroundColor(.white)
              .padding()
              .background(Color(.init(white: 1, alpha: 0.15)))
              .cornerRadius(10)
            Spacer()
              .frame(height: 30)
            
            GeometryReader { geometry in
              Button(action: {
                //viewModel.registerUser(email: "userName", password: "password", userName: "userName", fullName: "fullName", profileImage: selectedImage)
                viewModel.login()
              }, label: {
                  Text("Sign up")
              })
              .frame(width: (geometry.size.width*1), height: 50)
              .background(Color.white)
              .clipShape(Capsule())
              .padding(.vertical)
            }
            
          }.padding()
            
          Spacer()
          
          HStack {
            Text("Already have account? Login in")
              .foregroundColor(.white)
          }.onTapGesture {
            mode.wrappedValue.dismiss()
          }.padding(.bottom, 28)
          
          
          
          
        }
      }.sheet(isPresented: self.$isImagePickerDisplay) {
        ImagePickerViewHelper(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
      }
      
    }
}

标签: iosswiftxcodeswiftui

解决方案


错误消息清楚地表明,@EnvironmentObject属性包装器需要将关联的对象添加到具有environmentObject()修饰符的视图层次结构的更高级别的环境中。

要直接访问视图模型,您必须使用@Stateobject创建被观察类的实例

@Stateobject var viewModel = AuthViewModel()

推荐阅读