SwiftUI @EnvironmentObject错误:作为此视图的祖先可能会丢失 [英] SwiftUI @EnvironmentObject error: may be missing as an ancestor of this view
问题描述
我的第一个视图可以从API请求中获取所有数据,然后打开第二个视图以更改API请求数据,它崩溃了.
my first view can get all the data from API request, then opened second view to change the API request data, it crashed.
以下是错误
Fatal error: No ObservableObject of type NetworkManager found.
A View.environmentObject(_:) for NetworkManager may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.3/Core/EnvironmentObject.swift, line 55
2019-11-07 12:00:01.961425-0800 EarthQuake[73703:5913116] Fatal error: No ObservableObject of type NetworkManager found.
A View.environmentObject(_:) for NetworkManager may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.3/Core/EnvironmentObject.swift, line 55
这是一个快速文件,用于从API提取数据,然后将数据保存到帖子中
This is swift file to fetch data from API, then save data to posts
import Foundation
import Combine
final class NetworkManager: ObservableObject {
@Published var posts = [Post]()
func fetchData() {
//some code to fetch data, then save to posts
}
}
在我的第一个列表视图文件中:EarthQuakeList.swift
import SwiftUI
struct EarthQuakeList: View {
@EnvironmentObject var networkManager: NetworkManager
//@ObservedObject var networkManager = NetworkManager()
var body: some View {
NavigationView {
List(networkManager.posts) { post in
NavigationLink(destination: EarthQuakeDetail(detail: post.properties, location: post.locationCoordinate)) {
ListRow(magnitude: post.properties.mag ?? 0.0, place: post.properties.place)
}
}
.navigationBarTitle(Text("Today"))
.navigationBarItems(
trailing:
VStack {
Button(action: {
print("Edit button tapped")
self.showEditPage.toggle()
}) {
//Top right icon
Image(systemName: "pencil.circle")
.resizable()
.frame(width: 20, height: 20, alignment: .center)
}.sheet(isPresented: $showEditPage) {
return EditPage().environmentObject(self.networkManager)
}
}
)
}
.onAppear {
//Call function to fetch data
self.networkManager.fetchData()
}
}
}
一切正常,我可以看到所有数据,但是当我在第二个视图文件中执行相同的操作时,我会取回数据,但不会在第一个视图中更新
Everything works well, I can see all the data, but when I do the same thing in my second view file, I get the data back, but it does not update for the first view
在我的第二个编辑视图文件中:EditPage.swift
import SwiftUI
struct EditPage: View {
//@ObservedObject var networkManager = NetworkManager()
@EnvironmentObject var networkManager: NetworkManager
var body: some View {
VStack {
Text("Edite")
}
.onAppear(){
//I called the same function to get data as in first view file, but it is not updating the list view
self.networkManager.fetchData()
}
}
}
SceneDelegate.swift
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
//Set up environment object
let contentView = EarthQuakeList().environmentObject(NetworkManager())
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(
rootView: contentView
)
self.window = window
window.makeKeyAndVisible()
}
}
因此,我希望第二个视图文件调用函数 self.networkManager.fetchData()从API调用中获取数据,然后在第一个快捷文件 EarthQuakeList 中更新列表视图,问题是我只是返回正确的数据,视图未使用新数据更新
So I am expecting second view file to call function self.networkManager.fetchData() to get data from API call, then update list view in first swift file EarthQuakeList, the issue is I am just getting correct data back, the view is not updating with new data
推荐答案
只需添加self.networkManager @ EarthQuakeList.swift
The whole issue is very easy to fix just add self.networkManager @ EarthQuakeList.swift
.sheet(isPresented: $showEditPage) {
return EditPage().environmentObject(self.networkManager)
我从文章中得到了启发并得到了启发: https://github.com/peterfriese/Swift-EnvironmentObject-Demo
I got the reason and inspired from article: https://github.com/peterfriese/Swift-EnvironmentObject-Demo
这篇关于SwiftUI @EnvironmentObject错误:作为此视图的祖先可能会丢失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!