我有一个名为IndepthView的主类
struct InDepthView: View {
@EnvironmentObject var globalData: GlobalData
var body: some View {
Button(action: { self.showList.toggle() }) {
VStack(alignment: .leading) {
HStack {
Text("\(self.globalData.whichCountry.uppercased())")
.font(.system(size: 20)).bold()
}
}
}
.sheet(isPresented: $showList) {
ListOfCountriesView().environmentObject(GlobalData())
}
}
}
这是我的课程,其中包含要在视图之间传递的数据
import Foundation
class GlobalData: ObservableObject {
@Published var whichCountry: String = "italy"
}
这是我用来更改其他国家/地区文字的模式表
import SwiftUI
struct ListOfCountriesView: View {
@EnvironmentObject var globalData: GlobalData
var body: some View {
VStack {
Text("List of Countries")
Button(action: {
self.globalData.whichCountry = "usa"
print(self.globalData.whichCountry)
}) {
Text("USA")
}
}
}
}
正在更新“ whichCountry”的数据,因为我添加了打印语句以查看其是否被修改。但是主视图类(IndepthView)不会更新文本,而只会显示“意大利”。单击按钮(“美国”)并显示“美国”后,应该对其进行更新。我已确保eninvromentObject正确传递。让我知道是否需要更多说明或信息。
另外,为什么这在我的updateData()方法中总是崩溃。它说找不到“致命错误:找不到类型为GlobalData的ObservableObject。”]
class getDepthData: ObservableObject {
@Published var data : Specific!
@EnvironmentObject var globalData: GlobalData
init() {
updateData()
}
func updateData() {
let url = "https://corona.lmao.ninja/v2/countries/" // specific country
let session = URLSession(configuration: .default)
session.dataTask(with: URL(string: url+"\(self.globalData.whichCountry)")!) { (data, _, err) in
if err != nil {
print((err?.localizedDescription)!)
return
}
let json = try! JSONDecoder().decode(Specific.self, from: data!)
DispatchQueue.main.async {
self.data = json
}
}.resume()
}
}
您必须传递自己的全局数据引用,而不是创建新实例。请参见下面的内联。
struct InDepthView: View {
@EnvironmentObject var globalData: GlobalData
var body: some View {
Button(action: { self.showList.toggle() }) {
VStack(alignment: .leading) {
HStack {
Text("\(self.globalData.whichCountry.uppercased())")
.font(.system(size: 20)).bold()
}
}
}
.sheet(isPresented: $showList) {
ListOfCountriesView().environmentObject(self.globalData) // << fix !!
}
}
}