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应该是它的子视图。在你的方法中,它看起来更像是另一种方式。