ios - 为什么 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)
}
}
}
解决方案
错误消息清楚地表明,@EnvironmentObject
属性包装器需要将关联的对象添加到具有environmentObject()
修饰符的视图层次结构的更高级别的环境中。
要直接访问视图模型,您必须使用@Stateobject
创建被观察类的实例
@Stateobject var viewModel = AuthViewModel()
推荐阅读
- mongodb - 当 _id 动态生成时,mongoosastic 引用如何不起作用
- visual-studio - 简单的 void 方法有效,但协程抛出空引用异常
- python - 通过外键模型字段验证多对多模型的唯一性
- google-apps-script - 如何按包含特定标题的列对电子表格进行排序?
- ios - 以编程方式提供呼叫转移?
- python - Pandas - 遍历特定列中的行并找到空单元格
- typescript - 错误 TS5023:未知的编译器选项“resolveJsonModule”
- qt - 使用 QT 的 QJSEngine 时如何找到信号的“发送者”
- laravel - laravel http 客户端自定义数据
- python-3.x - python文件处理中的tell()如何工作