SwiftUI调用ViewModel方法提示未找到AuthViewModel类型ObservableObject怎么办
报错原因
这个崩溃的核心原因是:你在RegistrationView中通过@EnvironmentObject声明了要读取AuthViewModel类型的实例,但是你没有在该视图的上层父视图链路中注入过对应的AuthViewModel实例。SwiftUI的环境对象遵循自上而下的注入规则,必须先由上层视图注入,下层视图才能从环境中读取到对应实例,找不到就会触发这个致命错误。
解决方法
1. 全局注入(推荐)
找到项目的入口文件(SwiftUI 2.0+ 是带@main标记的App结构体文件),在根视图处注入全局的AuthViewModel实例,示例代码如下:
import SwiftUI @main struct TwitterSwiftUIApp: App { // 全局持有AuthViewModel实例 @StateObject private var authViewModel = AuthViewModel() var body: some Scene { WindowGroup { // 替换为你项目的实际根视图 ContentView() // 注入环境对象,所有子视图都可以直接读取 .environmentObject(authViewModel) } } }
只要根视图注入后,所有子视图包括RegistrationView都可以直接读取到这个实例,不需要重复注入。
提示:如果你的项目需要兼容iOS13,将上面的
@StateObject替换为@ObservedObject即可,或者在UIKit的AppDelegate中实例化后注入到根视图的环境中。
2. 局部注入
如果你的RegistrationView是通过跳转、弹窗等方式从某个子页面打开,不想做全局注入,可以在打开视图的位置单独给RegistrationView注入实例:
导航跳转场景示例:
NavigationLink(destination: RegistrationView().environmentObject(authViewModel)) { Text("注册账号") }
Sheet弹窗场景示例:
.sheet(isPresented: $showRegisterView) { RegistrationView() .environmentObject(authViewModel) }
内容的提问来源于stack exchange,提问作者A J
相关产品推荐
相关产品推荐

