【问题标题】:SwiftUI Fatal error: No ObservableObject of type foundSwiftUI 致命错误:未找到类型的 ObservableObject
【发布时间】:2020-04-18 21:16:47
【问题描述】:

我希望在我的应用程序中有一个点,我可以在其中存储一些数据并快速访问它。在 SwiftUI 之前,我只有 ApplicationDelegate 用于此目的。在我只需要调用 appDelegate.userService 之前,它为我提供了应用程序中的一个点,该点已初始化一次。没有更多的单例,只是 appDelegate。

现在我找到了这个tutorial如何使用@EnvironmentObject

我已在此处添加此代码来初始化我的 userService:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    var userService = UserService() 

...

我也有这段代码:

struct LoginView: View {

    @EnvironmentObject var userService: UserService

    var body: some View {

...

在上面的LoginView我有一个通过电子邮件从服务器获取用户的功能:

func fetchUser(with email: String) {

        userService.getUser(with: email) { (result) in
            switch result {
            case .success(let user):
                self.userService.user = user // update user in user service after fetch
                self.showWelcomeView = true
                break
            case .failure:
                break
            }

            self.showActivityIndicator = false
        }
    }

但是当我尝试调用getUser 函数时,我得到了这个错误:

Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55
2020-04-18 23:52:41.774988+0300 BusinessTool[7426:730172] Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55

这是我的用户服务:

class UserService: ObservableObject {

    enum UserFetchResult {
        case success(data: User)
        case failure
    }

    typealias UserServiceResponse = (User?, NSError?) -> Void

    @Published var user = User(username: "", email: "")
...

主要问题是如何解决上述问题?

我还有一些附带问题:

  1. 我是否需要设置这个环境单例对象 (@EnvironmentObject) 还是最好像以前一样使用 AppDelegate appDelegate.userService 并将所有需要的数据存储在那里,我看不出这个东西有什么好处。李>
  2. 如果有一些优势,我是否需要将用户服务设为ObservableObject,因为对我而言,用户服务更多的是关于执行某些功能(获取用户数据、更新服务器上的用户数据、本地存储等)而不是我们需要观察的数据模型层。这里完全糊涂了。在我上面提供的链接中,Paul 使用此 ObservableObject 进行应用设置,不确定这是否正确。
  3. 在我的示例中,我尝试从服务器获取用户并在获取后更新用户服务中的用户,这是正确或干净设计的代码还是我想多了?

【问题讨论】:

    标签: swift swiftui swift5 observableobject environmentobject


    【解决方案1】:

    在您的 SceneDelegate 中,您应该在根视图 (LoginView) 上调用 .environmentObject(userService)

    【讨论】:

    • 谢谢!我刚做了这个,它就像魔术LoginView().environmentObject(userService)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2023-03-03
    • 2020-05-11
    • 2021-03-11
    • 2021-12-30
    相关资源
    最近更新 更多