Swift 缺少作为视图祖先的视图

Swift 缺少作为视图祖先的视图,swift,observable,swiftui,swift5,observableobject,Swift,Observable,Swiftui,Swift5,Observableobject,我有一个login.swift,主要是: import SwiftUI class GlobalEnvironment: ObservableObject { @Published var accountId: Int = 0 } struct Login: View { @EnvironmentObject var env: GlobalEnvironment @State private var username: String = "" @Stat

我有一个
login.swift
,主要是:

import SwiftUI

class GlobalEnvironment: ObservableObject {

    @Published var accountId: Int = 0
}

struct Login: View {

    @EnvironmentObject var env: GlobalEnvironment

    @State private var username: String = ""
    @State private var password: String = ""

    @State var authenticationDdidFail: Bool = false
    @State var authenticationDidSucceed: Bool = false

    var body: some View {

        if env.accountId == 0 {
            return AnyView(LoginView(username: self.$username, password: self.$password, authenticationDdidFail: self.$authenticationDdidFail, authenticationDidSucceed: self.$authenticationDidSucceed))
        } else {
            return AnyView(ContentView().environmentObject(GlobalEnvironment()))
        }


    }
}
...
登录成功后,该文件在LoginView中设置
env.accountId

然后我有一个
data.swit
和:

struct Transaction: Codable, Identifiable {
    let id = UUID()
    var purpose: String
}

class Api {

    @EnvironmentObject var env: GlobalEnvironment

    func getTransactions(completion: @escaping ([Transaction]) -> ()) {

        guard let url = URL(string: "https://url.com/api.php?get_transactions&account=\(env.accountId)") else { return }

        URLSession.shared.dataTask(with: url) { (data, _, _) in
            let transactions = try! JSONDecoder().decode([Transaction].self, from: data!)
            DispatchQueue.main.async {
                completion(transactions)
            }

        }
        .resume()

}
事务调用API。swift

import SwiftUI

struct ContentView: View {

    @EnvironmentObject var env: GlobalEnvironment

    @State var transactions: [Transaction] = []

    var body: some View {
        NavigationView {
            List(transactions) { transaction in
                Text(transaction.purpose)

                }
            .environmentObject(GlobalEnvironment())
            .onAppear {
                Api().getTransactions { (transactions) in
                    self.transactions = transactions
                }
            }
            .navigationBarTitle(Text("Transactions"))
        }
    }
}
我得到的错误是线程1:致命错误:找不到GlobalEnvironment类型的ObservieObject。GlobalEnvironment的View.environmentObject(:)可能作为此视图的祖先而丢失。对于
guard let url=url(字符串:https://url.com/api.php?get_transactions&account=\(env.accountId)“)else{return}

根据我的理解,将GlobalEnvironment添加到Api类中应该可以工作,但实际上不行。相反,我已经尝试在函数中添加它,但它也不起作用。如您所见,将.environmentObject()添加到列表视图本身也是如此。

它必须是:

  .environmentObject(self.env)
当然,在SceneDelegate或其他地方可能会有进一步的错误。

必须是:

  .environmentObject(self.env)

当然,在SceneDelegate或其他地方可能会有进一步的错误。

您能否尝试在呼叫时将您的
environmentObject
发送到
onAppear

.onAppear 
{
    Api().getTransactions { (transactions) in
        self.transactions = transactions
    }.environmentObject(self.env)
}

您能否尝试在呼叫时将您的
environmentObject
发送到
onAppear

.onAppear 
{
    Api().getTransactions { (transactions) in
        self.transactions = transactions
    }.environmentObject(self.env)
}

这没有效果尽管我的回答是,你将要提出的观点的方法是不正确的。“if env.accountId==0”应该在您的ContentView中,而LoginView应该是它的子视图。在你的方法中,它看起来更像是另一种方法。这没有效果。尽管我的回答是,你将要提出的观点是不正确的。“if env.accountId==0”应该在您的ContentView中,而LoginView应该是它的子视图。在你的方法中,它看起来更像是另一种方式。